﻿using System;
using System.Collections.Generic;

namespace DoNet.SFExpress.Framework.COM_RECE_IUOP
{
    /// <summary>
    /// 国际件API
    /// </summary>
    public class ComReceIuopApi
    {
        #region 国际快递业务场景接入

        /// <summary>
        /// 创建物流订单 
        /// 创建快递订单或修改已创建的订单
        /// 注意：仅允许顺丰收件前修改
        /// </summary>
        /// <param name="partnerID"></param>
        /// <param name="checkword"></param>
        /// <param name="data">业务数据报文 json字符串</param>
        /// <param name="environment">调用环境，bspgw：生产环境；sfapi-hk：香港生产环境；sfapi-sbox：沙箱环境</param>
        /// <returns></returns>
        public static JsonResult IuopCreateOrder(string partnerID, string checkword, MsgDataRequestIuopCreateOrder data, string accessToken = "", string environment = "bspgw")
        {
            /*	
            2.3. 请求参数<msgData>
            2.3.1 元素<请求>
            序号	属性名	类型(约束)	必填	默认值	描述
            1	customerCode	String(50)	Y		客户编码
            2	version	String(10)	N		版本号（默认为空即可）
            3	orderOperateType	Integer	N		订单操作类型：
            1-新增
            5-改单
            默认1
            4	customerOrderNo	String(64)	Y		客户订单号 （不能与历史订单号重复）
            5	customerOrderNoTwo	String(64)	N		客户订单号2
            6	sfWaybillNo	String(32)	N		顺丰运单号
            7	interProductCode	String(32)	Y		国际产品映射码，即顺丰物流服务产品代码
            8	parcelQuantity	Int(8)	Y		包裹总件数(大于1表示是子母件，最大值300)
            9	parcelTotalWeight	BigDecimal(16,2)	N		包裹总重量。精确到小数点后2位，默认为KG
            10	parcelWeightUnit	String(16)	N		包裹总重量单位，默认KG
            11	parcelTotalLength	BigDecimal(16,2)	N		客户订单货物总长。精确到小数点后2位，默认单位CM
            12	parcelTotalWidth	BigDecimal(16,2)	N		客户订单货物总宽。精确到小数点后2位，默认单位CM
            13	parcelTotalHeight	BigDecimal(16,2)	N		客户订单货物总高。精确到小数点后2位，默认单位CM
            14	declaredValue	BigDecimal (16,2)	Y		总商品申报价值，数值应等于ParcelInfo中所有物品的价值之和
            15	declaredCurrency	String(10)	Y		申报价值币种
            16	parcelVolumeUnit	String(16)	N		客户订单货物长度单位
            可选项：CM、INCH
            原寄国为CA和US时，长度单位为INCH，其余国家/地区为CM
            17	pickupType	String(2)	N		寄件方式：
            0-服务点自寄或自行联系快递员
            1-上门收件
            ( 寄件地址相同的批量订单如无特殊要求一般请选择自行联系快递员，若选择上门收件则顺丰小哥会收到上门请求后在约定时间上门取件)
            18	pickupAppointTime	String(20)	N		上门取件预约时间。格式：yyyy-MM-dd HH:mm 若寄件方式选择了上门收件，则预约方式必填
            19	pickupAppointTimeZone	String(100)	N		上门预约时间时区 详细参考附录字典
            20	remark	String(200)	N		运单备注
            21	isBbd	String(8)	N		是否BBD 0-不是 1-BBD单（需提前开通BBD权限）；
            22	orderExtendInfo	OrderExtendInfo	N		订单额外信息
            23	paymentInfo	PaymentInfo	Y		付款方式信息
            24	senderInfo	SenderInfo	Y		寄件人信息
            25	receiverInfo	ReceiverInfo	Y		收件人信息
            26	customsInfo	CustomsInfo	N		报关信息
            27	parcelInfoList	List<ParcelInfo>	Y		包裹信息
            28	addServiceInfoList	List<AddServiceInfo>	N		增值服务信息
            29	childInfoList	List<ChildInfo>	N		子单信息
            30	extendAttributeList	List<OrderExtendAttribute>	N		扩展属性
            31	ecommerceInfo	OrderEcommerceInfo	N		电子商务信息
            32	agentWaybillNo	String(40)	N		代理运单号
            33	labelModeSize	Integer	N		面单打印样式；默认为1
            0：面单类100*210；
            1：面单类100*150；
            2：面单类100*45（BBD合单包裹条形码）
            3：面单类，100*150(捡货面单)
            4：面单类，100*210(捡货面单)
            5：面单类，100*45(参考编号面单)
            7：面单类100*45(BBD合单包裹二维码)
            8：面单类100*45(BBD预合单大包裹条形码)
            34	isReturnRouteLabel	Integer	N		是否返回路由标签：
            1：返回路由标签
            0：不返回
            2.3.1.1 元素<请求> OrderExtendInfo
            序号	属性名	类型(约束)	必填	默认值	描述
            1	isSignBack	String(8)	N		是否要求签回单;
            0-否
            1-是（签回原寄地）
            2-是（签回第三方地址）
            2	isSelfPick	String(8)	N		是否自取件：
            0-否
            1-是
            3	signBackWaybillNo	String(32)	N		签回回单号
            4	preMergeSfWaybillNo	String(32)	N		BBD预合单号
            5	poNumber	String(256)	N		PO Number
            6	importerCompanyName	String(100)	N		进口商公司名称
            7	importerPhoneCode	String(10)	N		进口商联系电话区号
            8	importerPhoneNumber	String(256)	N		进口商联系电话（3-20位纯数字）
            9	importerAddress	String(200)	N		进口商地址
            2.3.1.2 元素<请求> PaymentInfo
            序号	属性名	类型(约束)	必填	默认值	描述
            1	payMethod	String(8)	Y		运费付款方式：
            1-寄方付
            2-收方付
            3-第三方付
            2	payMonthCard	String(20)	N		月结卡号（月结支付时填写，现金支付时留空）
            3	taxPayMethod	String(8)	Y		税金付款方式：
            1-寄方付
            2-收方付
            3-第三方付
            （税金无特殊情况通常为收方现金支付，如需寄方支付或第三方支付，税金月结卡号必填且需签署额外的税金结算协议，详情可咨询顺丰客户经理。非跨境订单或无税金产生时选择收方现金支付即可）
            4	taxPayMonthCard	String(20)	N		税金月结卡号
            （税金付款方式选择寄付或第三方支付时，税金月结卡号必填，收方现金支付时留空）
            2.3.1.3 元素<请求> SenderInfo
            序号	属性名	类型(约束)	必填	默认值	描述
            1	company	String(100)	N		寄件方公司
            2	contact	String(100)	Y		寄件方姓名
            3	country	String(5)	Y		寄件方国家/地区，如：CN,US,JP,KR,SG,MY 更多参考附录字典
            4	postCode	String(20)	Y		邮编
            5	regionFirst	String(128)	Y		寄件方地址一级区划（州/省）
            6	regionSecond	String(128)	Y		寄件方地址二级区划（城市）
            7	regionThird	String(128)	N		寄件方地址三级区划（区/县）
            8	address	String(200)	Y		寄件方详细地址
            9	email	String(128)	N		寄件方邮箱
            10	telAreaCode	String(10)	N		寄件方固定电话区号
            11	telNo	String(20)	N		寄件方固定电话。寄件方手机号和寄件方固定电话至少填写一个
            12	phoneAreaCode	String(10)	N		寄件方移动电话区号
            13	phoneNo	String(20)	N		寄件方移动电话。寄件方手机号和寄件方固定电话至少填写一个
            14	cargoType	INT(1)	N		寄件类型：1-个人件；2-公司件
            15	certType	String(10)	N		收件方证件类型
            16	certCardNo	String(100)	N		寄件方证件号
            17	vat	String(18)	N		寄件方VAT号
            18	eori	String(100)	N		寄件方EORI号
            19	iossNo	String(100)	N		寄件方IOSS号
            20	lvgNo	String(100)	N		寄件方LVG号（马来西亚进口专用，单票500RM以内，过去12个月销售额超过50万RM使用）
            2.3.1.4 元素<请求> ReceiverInfo
            序号	属性名	类型(约束)	必填	默认值	描述
            1	company	String(100)	N		收件方公司
            2	contact	String(100)	Y		收件方姓名
            3	country	String(5)	Y		收件方国家/地区，如：CN,US,JP,KR,SG,MY 更多参考附录字典
            4	postCode	String(20)	Y		邮编
            5	regionFirst	String(128)	Y		收件方地址一级区划（州/省）
            6	regionSecond	String(128)	Y		收件方地址二级区划（城市）
            7	regionThird	String(128)	N		收件方地址三级区划（区/县）
            8	address	String(200)	Y		收件方详细地址
            9	regionFifth	String(100)	N		收件方地址五级区划（道路名，收件方国家为韩国，则必填，长度100）
            10	regionSixth	String(100)	N		收件方地址六级区划（建筑编号，收件方国家为韩国，则必填）
            11	email	String(128)	N		收件方邮箱
            （若收件国家/地区为GB|IE|NL|MT|DE|FR|ES|IT|BE|AT|HU|PT|DK|CZ|HR|GR|BG|LU|SI|SK|RO|CY|SE|FI|LT|LV|PL|EE|IN|CH|VN 时必填）
            12	telAreaCode	String(10)	N		收件方固定电话区号
            13	telNo	String(20)	N		收件方固定电话。收件方手机号和收件方固定电话至少填写一个
            14	phoneAreaCode	String(10)	N		收件方移动电话区号
            15	phoneNo	String(20)	N		收件方移动电话。收件方手机号和收件方固定电话至少填写一个
            16	cargoType	INT(1)	N		收件类型：
            1-个人件
            2-公司件
            17	certType	String(10)	N		收件方证件类型（跨境件收件国家/地区为ID,TW时必填）
            18	certCardNo	String(100)	N		收件方证件号 （跨境件收件国家/地区为ID,TW时必填）
            19	vat	String(18)	N		收件方VAT号
            20	eori	String(100)	N		收件方EORI号
            21	contactI18n	String(100)	N		收件方姓名（多语言）
            22	addressI18n	String(200)	N		收件方详细地址（多语言）
            2.3.1.5 元素<请求> CustomsInfo
            序号	属性名	类型(约束)	必填	默认值	描述
            1	tradeCondition	String(30)	N		贸易条件，参考附录字典
            2	senderReason	Int(2)	N		寄件原因：
            1-商业
            2-非商业
            3	senderReasonContent	String(256)	N		寄件原因内容
            4	businessRemark	String(256)	N		商业发票备注
            5	customsBatch	String(20)	N		报关批次
            6	importCustomsType	String(30)	N		进口报关方式 参考附录字典
            7	exportCustomsType	String(30)	N		出口报关方式 参考附录字典
            8	harmonizedCode	String(100)	N		Harmonized Code美国寄出的可填写
            9	aesNo	String(100)	N		AES No.美国寄出可填写
            2.3.1.6 元素<请求> ParcelInfo
            序号	属性名	类型(约束)	必填	默认值	描述
            1	name	String(100)	Y		商品名称
            2	eName	String(100)	N		商品英文名称
            3	unit	String(32)	Y		货物单位，如：个，台
            4	amount	DECIMAL(24,10)	Y		单件商品申报价值
            5	quantity	DECIMAL(16,6)	Y		数量
            6	originCountry	String(5)	Y		原产国家，如：CN,US,JP,KR,SG,MY 更多参考附录字典
            7	hsCode	String(100)	N		海关编码
            8	brand	String(16)	N		品牌
            9	stateBarCode	String(64)	N		国条码
            10	productCustomsNo	String(100)	N		海关备案号
            11	productRecordNo	String(18)	N		货物产品国检备案编号
            12	goodsCode	String(60)	N		商品编号
            13	goodsUrl	String(2000)	N		商品链接
            14	weight	DECIMAL	N		托寄物重量，单件商品SKU重量（不能小于0, 单位KG）。支持小数点后2位
            15	goodsDesc	String(200)	N		商品描述
            16	material	String(600)	N		材质
            17	specifications	String(64)	N		型号
            18	itemNo	String(30)	N		商品序号
            19	qtyOne	Decimal(19,5)	N		法定第一数量
            20	unitOne	String(30)	N		法定第一计量单位
            21	qtyTwo	Decimal(19,5)	N		法定第二数量
            22	unitTwo	String(30)	N		法定第二计量单位
            23	htsCode	String(60)	N		海关编码(美国)
            24	htsDesc	String(200)	N		海关编码描述
            25	eccn	String(60)	N		出口管制号码
            26	productNameElement	String(1024)	N		品名申报要素，支持多个要素，要素名使用“[]”标记，多要素使用“;”分隔，
            填写规范：[要素名1]要素值1;[要素名2]要素值2，
            例如：[用途]机械加工用;[型号]101.030 MKF-600
            2.3.1.7 元素<请求> AddServiceInfo
            序号	属性名	类型(约束)	必填	默认值	描述
            1	serviceCode	String(32)	N		增值服务编码
            2	value	String(256)	N		增值服务扩展属性
            3	valueOne	String(256)	N		增值服务扩展属性1
            2.3.1.8 元素<请求> ChildInfo
            序号	属性名	类型(约束)	必填	默认值	描述
            1	sfWaybillNo	String(32)	N		子单编号
            2	weight	DECIMAL(16,3)	N		托寄物重量
            3	length	DECIMAL(17,3)	N		长，单位厘米
            4	width	DECIMAL(17,3)	N		宽，单位厘米
            5	height	DECIMAL(17,3)	N		高
            6	boxNo	String(64)	N		箱号；箱号在子单集合中不能重复；如果使用箱号，请把包含母单对应的箱号全部传入
            2.3.1.9 元素<请求> OrderExtendAttribute
            序号	属性名	类型(约束)	必填	默认值	描述
            1	attributeName	String(200)	N		属性名 参考附录字典
            2	attributeValue	String(1024)	N		属性值
            2.3.1.10 元素<请求> OrderEcommerceInfo
            序号	属性名	类型(约束)	必填	默认值	描述
            1	payerCertType	String(200)	N		订购人证件类型
            2	payerCertNo	String(1000)	N		订购人证件号码
            3	payerName	String(100)	N		订购人姓名
            4	payerTel	String(300)	N		订购人联络电话
            5	buyerEmail	String(300)	N		买家邮件地址
            6	buyerNickname	String(100)	N		买家昵称
            7	buyerFreight	decimal(10,2)	N		买家邮费（电商收取消费者的邮费）
            8	buyerPremium	decimal(10,2)	N		买家保费（电商收取消费者的保价费用）
            9	tax	String(10)	N		税款，企业预先代扣的税款金额
            10	preferentialAmount	decimal(10,2)	N		优惠金额（整个订单的，电商给消费者的优惠金额）
            11	actPay	decimal(10,2)	N		成交实际付款金额（消费者向电商支付的金额，商品价格+运杂费+代扣税款-优惠金额）
            12	currency	String(10)	N		结算币种
            13	payToolType	String(100)	N		支付工具、方式，如支付宝，财付通
            14	applicationNo	String(100)	N		申请单编号
            15	payNo	String(100)	N		支付交易号
            16	platformDomainName	String(100)	N		电商平台域名
            17	payTime	datetime	N		支付交易时间
            18	promotionType	String(100)	N		促销类型
            19	sellerEmail	String(300)	N		卖家邮件地址
            20	sellerNickname	String(100)	N		卖家昵称
            21	sellerAlipayNo	String(300)	N		卖家支付宝账号
            22	payEnterpriseCustomsCode	String(20)	N		支付企业的海关注册登记编号
            23	payEnterpriseCheckCode	String(20)	N		支付企业的国检注册登记编号
            24	payEnterpriseName	String(100)	N		支付企业名称
            25	storeCode	String(50)	N		店铺代码
            26	shopWebCode	String(100)	N		购物网站代码
            27	enterpriseName	String(100)	N		电商企业的海关注册登记名称
            28	enterpriseCustomsCode	String(20)	N		电商企业的海关注册登记编号
            29	enterpriseCheckCode	String(20)	N		电商企业的国检注册登记编号
            30	enterpriseCrossCode	String(20)	N		电商企业的跨境平台注册登记编号
            31	platformName	String(100)	N		电商平台的海关注册登记名称
            32	platformCustomsCode	String(20)	N		电商平台的海关注册登记编号
            33	platformCheckCode	String(20)	N		电商平台的国检注册登记编号
            34	partZoneCode	String(32)	N		分区码
            35	portCode	String(32)	N		口岸
            36	importCustomsType	String(30)	N		进口报关方式
            2.4. 公共响应参数
            #	属性名	类型(约束)	必填	默认值	描述
            1	success	String	是		true 请求成功，false 请求失败
            2	errorCode	String	是		错误编码，0成功
            3	errorMsg	String	是		错误描述
            4	msgData	Object	是		返回的详细数据
            2.5. 响应参数<msgData>
            2.5.1 元素<响应>
            #	属性名	类型(约束)	必填	描述
            1	customerOrderNo	String		订单号
            2	sfWaybillNo	String		运单号
            3	agentWaybillNo	String		代理/服务商运单号
            6	childWaybillNoList	List<String>		子运单号
            7	identityUploadUrl	String		身份证上传地址
            8	invoiceUrl	String		发票打印地址
            9	labelUrl	String		运单打印地址
            10	routeLabelInfoList	List<RouteLabelInfo>		路由标签信息
            11	childInfoList	List<ChildInfo>		子件信息
            2.5.1.1 元素ChildInfo
            #	属性名	类型(约束)	必填	描述
            1	sfWaybillNo	String(32)		子单编号
            2	weight	DECIMAL(16,3)		托寄物重量
            3	length	DECIMAL(17,3)		长，单位厘米
            4	width	DECIMAL(17,3)		宽，单位厘米
            5	height	DECIMAL(17,3)		高
            6	boxNo	String(64)		箱号；箱号在子单集合中不能重复；如果使用箱号，请把包含母单对应的箱号全部传入
            2.5.1.2 元素routeLabelInfo
            #	属性名	类型(约束)	必填	描述
            1	destRouteLabel	String		路由标签
            2	twoDimensionCode	String		面单二维码信息
            2.6. 请求示例\应用场景(JSON)示例
            请求报文:（msgData字段）:

            {
                "customerCode": "ICRME000SRN93", 
                "declaredCurrency": "USD", 
                "declaredValue": 10, 
                "orderOperateType": "1", 
                "parcelQuantity": 2, 
                "parcelTotalWeight": 0.5, 
                "parcelWeightUnit": "KG", 
                "parcelVolumeUnit": "CM", 
                "parcelTotalLength": "1", 
                "parcelTotalWidth": "1", 
                "parcelTotalHeight": "1", 
                "pickupAppointTime": "", 
                "pickupAppointTimeZone": "", 
                "pickupType": "0", 
                "remark": "", 
                "sfWaybillNo": "", 
                "version": "", 
                "customerOrderNo": "lhtest0220##timestamp", 
                "customerOrderNoTwo": "", 
                "interProductCode": "INT0014", 
                "isBbd": 0, 
                "agentWaybillNo": "AG202007060053",
                "paymentInfo": {
                    "payMethod": "1", 
                    "payMonthCard": "0270000250", 
                    "taxPayMethod": "2", 
                    "taxPayMonthCard": ""
                },
                "addServiceInfoList": [
                    {
                        "serviceCode": "", 
                        "value": "", 
                        "valueOne": ""
                    }
                ],  
                "childInfoList": [
                    {
                        "sfWaybillNo": "", 
                        "length": "1.31", 
                        "width": "2.31", 
                        "height": "3.21", 
                        "weight": "4.21"
                    },
                    {
                        "sfWaybillNo": "", 
                        "length": "1.31", 
                        "width": "2.31", 
                        "height": "3.21", 
                        "weight": "4.21"
                    }
                ], 
                "customsInfo": {
                    "aesNo": "", 
                    "businessRemark": "", 
                    "customsBatch": "", 
                    "harmonizedCode": "", 
                    "senderReasonContent": "", 
                    "tradeCondition": ""
                }, 
                "orderExtendInfo": {
                    "isSelfPick": "", 
                    "isSignBack": "", 
                    "signBackWaybillNo": "", 
                    "businessMode": "0", 
                    "senderDeptCode": "755A", 
                    "operEmpCode": "000212"
                }, 
                "parcelInfoList": [
                    {
                        "amount": 0.1, 
                        "brand": "", 
                        "currency": "", 
                        "goodsCode": "", 
                        "goodsDesc": "", 
                        "goodsUrl": "", 
                        "hsCode": "", 
                        "name": "iPhone", 
                        "originCountry": "SG", 
                        "productCustomsNo": "", 
                        "productRecordNo": "", 
                        "quantity": 1, 
                        "stateBarCode": "", 
                        "unit": "个"
                    }
                ], 
                "receiverInfo": {
                    "address": "新加坡 详细地址", 
                    "cargoType": 1, 
                    "certCardNo": "430527199309204211", 
                    "certType": "001", 
                    "company": "", 
                    "contact": "李想", 
                    "country": "CN", 
                    "email": "iuop@test.com", 
                    "eori": "", 
                    "phoneAreaCode": "86", 
                    "phoneNo": "18888800000", 
                    "postCode": "536727", 
                    "telAreaCode": "86", 
                    "telNo": "9516168888", 
                    "vat": "",
              "regionFirst": "guang dong",
              "regionSecond": "shen zhen",
              "regionThird": "bao an"
                }, 
                "senderInfo": {
                    "address": "306 S BRYN MAWR AVE", 
                    "cargoType": 1, 
                    "certCardNo": "", 
                    "certType": "001", 
                    "company": "", 
                    "contact": "宏宏宏少", 
                    "country": "US", 
                    "email": "iuop@test.com", 
                    "eori": "", 
                    "phoneAreaCode": "65", 
                    "phoneNo": "54875485", 
                    "postCode": "759973", 
                    "telAreaCode": "86", 
                    "telNo": "9516168888", 
                    "vat": "",
              "regionFirst": "Alaska",
              "regionSecond": "Juneau",
              "regionThird": "Borough"
                }, 
                "ecommerceInfo": {
                    "actPay": 1221, 
                    "applicationNo": "1231231321", 
                    "buyerEmail": "12312@dd.com", 
                    "buyerFreight": 123132, 
                    "buyerNickname": "zhagnsan21", 
                    "buyerPremium": 122, 
                    "currency": "TWD", 
                    "enterpriseCheckCode": "1232", 
                    "enterpriseCrossCode": "12342", 
                    "enterpriseCustomsCode": "电商企业的海关注册登记编号21", 
                    "enterpriseName": "电商企业的海关注册登记编号2", 
                    "payEnterpriseCheckCode": "22212", 
                    "payEnterpriseCustomsCode": "22222", 
                    "payNo": "123123123", 
                    "payTime": "2022-03-31 15:01:42", 
                    "payToolType": "zhifubao", 
                    "payerCertNo": "3331", 
                    "payerCertType": "001", 
                    "payerName": "zhifubao", 
                    "payerTel": "1231231231", 
                    "platformCheckCode": "44441", 
                    "platformCustomsCode": "电商平台的海关注册登记编号", 
                    "platformDomainName": "ali.com", 
                    "platformName": "电商平台的海关注册登记名称", 
                    "preferentialAmount": 12312, 
                    "promotionType": "1", 
                    "sellerAlipayNo": "5551", 
                    "sellerEmail": "1312@ww.com", 
                    "sellerNickname": "lisi2", 
                    "shopWebCode": "购物网站代码21", 
                    "storeCode": "12378", 
                    "tax": "6666"
                }
            }
            2.7. 返回示例\应用场景(JSON)示例
            响应报文:

            成功响应:
            {
                "success": true,
                "errorCode": "0",
                "errorMsg": "Executed successfully",
                "msgData": {
                    "childInfoList": [],
                    "identityUploadUrl": "",
                    "childWaybillNoList": [
                        "SF2010307026026"
                    ],
                    "invoiceUrl": "http://iuop-uat.sit.sf-express.com:9000/iuop-iuop-uat/api/print/printInvoice?sfWaybillNos=123",
                    "routeLabelInfoList": [],
                    "labelUrl": "http://iuop-uat.sit.sf-express.com:9000/iuop-iuop-uat/api/print/printLabel?sfWaybillNos=123",
                    "customerOrderNo": "lhtest0220#ddk1287imestamp",
                    "sfWaybillNo": "SF1390007314092"
                }
            }
            失败响应：
            {
                "success": false,
                "errorCode": "123052",
                "errorMsg": "The customer order number is identical with an order number in history order data.",
                "msgData": null
            }
            3.附录
            3.1. 国际件产品列表
            国际产品映射码	国际产品名称	支持的业务类型	备注
            INT0054	国际小包	快递IUOP	除CN、HK始发出口流向，其余流向使用该产品下单
            INT0263	国际电商专递-CD	快递IUOP	除CN、HK始发出口流向，其余流向使用该产品下单
            INT0007	国际标快（文件	快递IUOP	收件国家若为CN,AU,ID,MY,SG,TH,VN,JP,KR,KH,MM,MN时，使用国际标快
            其余使用国际标快+
            INT0008	国际标快（包裹）	快递IUOP	收件国家若为CN,AU,ID,MY,SG,TH,VN,JP,KR,KH,MM,MN时，使用国际标快
            其余使用国际标快+
            INT0137	国际标快+（文件）	快递IUOP	收件国家若为CN,AU,ID,MY,SG,TH,VN,JP,KR,KH,MM,MN时，使用国际标快
            其余使用国际标快+
            INT0139	国际标快+（包裹）	快递IUOP	收件国家若为CN,AU,ID,MY,SG,TH,VN,JP,KR,KH,MM,MN时，使用国际标快
            其余使用国际标快+
            INT0013	国际特惠（文件）	快递IUOP	
            INT0014	国际特惠（包裹）	快递IUOP	
            INT0253	国际大件	快递IUOP	
            INT0282	国际重货-港到港	快递IUOP	
            INT0275	国际重货-门到门	快递IUOP	
            INT0173	国际标快-BD2	快递IUOP	
            INT0174	国际标快-BD3	快递IUOP	
            INT0175	国际标快-BD4	快递IUOP	
            INT0176	国际标快-BD5	快递IUOP	
            INT0177	国际标快-BD6	快递IUOP	
            INT0172	国际标快-BDE	快递IUOP	
            INT0001	E顺递	快递IUOP	
            INT0009	电商标快	快递IUOP	
            INT0287	国际仓储-头程	快递IUOP	
            INT0280	国际特惠-FBA	快递IUOP	
            INT0201	集货转运	快递IUOP	
            INT0010	陆运包裹	快递IUOP	
            INT0005	顺丰特快	快递IUOP	
            INT0006	顺丰特快（D类）	快递IUOP	
            INT0011	顺丰标快	快递IUOP	
            INT0214	顺丰特惠（D类）	快递IUOP	
            INT0248	自贸区特配	快递IUOP	
            INT0638	国际特快（文件）	快递IUOP	
            INT0639	国际特快（包裹）	快递IUOP	
            */
            string errcode = "";
            string errmsg = "";
            string resultdata = "";

            string serviceCode = "COM_RECE_IUOP_CREATE_ORDER";
            string msgData = SFCommon.JsonCompress(JsonHelper.SerializeObject(data));
            string timestamp = SFCommon.GetTimeStamp(); //获取时间戳
            string requestID = Guid.NewGuid().ToString(); //获取uuid

            Dictionary<string, string> content = new Dictionary<string, string>();
            content["partnerID"] = partnerID;
            content["requestID"] = requestID;
            content["serviceCode"] = serviceCode;
            content["timestamp"] = timestamp;
            if (!string.IsNullOrWhiteSpace(accessToken))
            {
                content["accessToken"] = accessToken;
            }
            else
            {
                string msgDigest = SFCommon.MD5ToBase64String(SFCommon.UrlEncode(msgData + timestamp + checkword));
                content["msgDigest"] = msgDigest;
            }
            content["msgData"] = msgData;

            var result = HttpHelper.GetResponseApiResultData(content, null, environment);
            if (result != null)
            {
                if (result.apiResultCode == "A1000")
                {
                    var msgDataResponse = JsonHelper.DeserializeObject<ResponseIuopCreateOrder>(result.apiResultData);
                    if (msgDataResponse != null)
                    {
                        errmsg = msgDataResponse.errorMsg;
                        resultdata = JsonHelper.SerializeObject(msgDataResponse.msgData);
                        if (msgDataResponse.success)
                        {
                            errcode = "0";
                        }
                        else
                        {
                            errcode = msgDataResponse.errorCode;
                        }
                    }
                    else
                    {
                        errcode = "-2";
                        errmsg = "未返回业务数据";
                        resultdata = "";
                    }
                }
                else
                {
                    errcode = result.apiResultCode;
                    errmsg = result.apiErrorMsg;
                    resultdata = result.apiResultData;
                }
            }
            else
            {
                errcode = "-1";
                errmsg = "接口未返回内容";
                resultdata = "";
            }

            return new JsonResult
            {
                errcode = errcode,
                errmsg = errmsg,
                data = resultdata
            };
        }

        /// <summary>
        /// 获取发货面单
        /// 客户可以通过运单号获取运单和发票的打印文件
        /// 注意：目前创建物流订单接口返回信息中已包含面单的下载链接，通常无需专门对接此接口获取面单
        /// </summary>
        /// <param name="partnerID"></param>
        /// <param name="checkword"></param>
        /// <param name="data">业务数据报文 json字符串</param>
        /// <param name="environment">调用环境，bspgw：生产环境；sfapi-hk：香港生产环境；sfapi-sbox：沙箱环境</param>
        /// <returns></returns>
        public static JsonResult IuopPrintOrder(string partnerID, string checkword, MsgDataRequestIuopPrintOrder data, string accessToken = "", string environment = "bspgw")
        {
            /*	
            2.3. 请求参数<msgData>
            2.3.1 元素<请求>
            序号	属性名	类型(约束)	必填	默认值	描述
            1	customerCode	String(50)	Y		客户编码
            2	requestId	String(64)	Y		请求id（可使用UUID，确保请求唯一性字段，只要确保每个请求的requestId唯一即可）
            3	version	String(10)	N		版本号（默认为空即可）
            4	labelModeSize	Integer	N		面单打印样式；
            0：面单类100*210；
            1：面单类100*150；
            2：面单类100*45（BBD合单包裹条形码）
            3：面单类，100*150(捡货面单)
            4：面单类，100*210(捡货面单)
            5：面单类，100*45(参考编号面单)
            7：面单类100*45(BBD合单包裹二维码)
            8：面单类100*45(BBD预合单大包裹条形码)
            printType=1时默认值为1，printType=2时默认值为0
            5	printType	String(8)	Y		打印类型。1-运单 2-发票
            6	printWaybillNoDtoList	List<PrintWaybillNoDto>	Y		支持批量打印 母单相同的子单（含母单） 打印参数对象
            7	fileFormat	String(8)	Y		打印文件格式：PDF或者ZPL；默认为PDF
            8	resolution	String(5)	Y		ZPL文件分辨率，支持203dpi和300dpi，仅在fileFormat为ZPL时有效
            2.3.1.1 元素<请求> PrintWaybillNoDto
            序号	属性名	类型(约束)	必填	默认值	描述
            1	sfWaybillNo	String(32)	Y		顺丰运单号
            2	isPrintSubParent	Integer	N		是否打印全部的子母单
            0：否
            1：是
            非子母单传1即可
            3	singlePrintWaybillNoList	List<String>	N		单独打印的运单号集合(含母单，子单)；若isPrintSubParent 为0，则必填
            2.4. 公共响应参数
            #	属性名	类型(约束)	必填	默认值	描述
            1	success	String	是		true 请求成功，false 请求失败
            2	errorCode	String	是		错误编码，0成功
            3	errorMsg	String	是		错误描述
            4	msgData	Object	是		返回的详细数据
            2.5. 响应参数<msgData>
            2.5.1 元素<响应>
            #	属性名	类型(约束)	必填	描述
            1	url	String		打印的URL
            2.6. 请求示例\应用场景(JSON)示例
            请求报文:（msgData字段）:

            {
                "customerCode": "ICRME000SRN93",
                "labelModeSize": 0,
                "printType": "1",
                "printWaybillNoDtoList": [
                    {
                        "isPrintSubParent": 1,
                        "sfWaybillNo": "SF1030358177716"
                    }
                ]
            }
            2.7. 返回示例\应用场景(JSON)示例
            响应报文:

            成功响应:
            {
                "success": true,
                "errorCode": "0",
                "errorMsg": null,
                "msgData": {
                    "url": "http://iuop-uat.sit.sf-express.com:9000/iuop-iuop-uat/api/print/printLabelByToken?token=123"
                }
            }
            失败响应：
            {
                "success": false,
                "errorCode": "123052",
                "errorMsg": "",
                "msgData": null
            }
            */
            string errcode = "";
            string errmsg = "";
            string resultdata = "";

            string serviceCode = "COM_RECE_IUOP_PRINT_ORDER";
            string msgData = SFCommon.JsonCompress(JsonHelper.SerializeObject(data));
            string timestamp = SFCommon.GetTimeStamp(); //获取时间戳
            string requestID = Guid.NewGuid().ToString(); //获取uuid

            Dictionary<string, string> content = new Dictionary<string, string>();
            content["partnerID"] = partnerID;
            content["requestID"] = requestID;
            content["serviceCode"] = serviceCode;
            content["timestamp"] = timestamp;
            if (!string.IsNullOrWhiteSpace(accessToken))
            {
                content["accessToken"] = accessToken;
            }
            else
            {
                string msgDigest = SFCommon.MD5ToBase64String(SFCommon.UrlEncode(msgData + timestamp + checkword));
                content["msgDigest"] = msgDigest;
            }
            content["msgData"] = msgData;

            var result = HttpHelper.GetResponseApiResultData(content, null, environment);
            if (result != null)
            {
                if (result.apiResultCode == "A1000")
                {
                    var msgDataResponse = JsonHelper.DeserializeObject<ResponseIuopPrintOrder>(result.apiResultData);
                    if (msgDataResponse != null)
                    {
                        errmsg = msgDataResponse.errorMsg;
                        resultdata = JsonHelper.SerializeObject(msgDataResponse.msgData);
                        if (msgDataResponse.success)
                        {
                            errcode = "0";
                        }
                        else
                        {
                            errcode = msgDataResponse.errorCode;
                        }
                    }
                    else
                    {
                        errcode = "-2";
                        errmsg = "未返回业务数据";
                        resultdata = "";
                    }
                }
                else
                {
                    errcode = result.apiResultCode;
                    errmsg = result.apiErrorMsg;
                    resultdata = result.apiResultData;
                }
            }
            else
            {
                errcode = "-1";
                errmsg = "接口未返回内容";
                resultdata = "";
            }

            return new JsonResult
            {
                errcode = errcode,
                errmsg = errmsg,
                data = resultdata
            };
        }

        /// <summary>
        /// 查询物流订单
        /// 根据客户编码及订单详情请求对象查询订单信息
        /// </summary>
        /// <param name="partnerID"></param>
        /// <param name="checkword"></param>
        /// <param name="data">业务数据报文 json字符串</param>
        /// <param name="environment">调用环境，bspgw：生产环境；sfapi-hk：香港生产环境；sfapi-sbox：沙箱环境</param>
        /// <returns></returns>
        public static JsonResult IuopQueryOrder(string partnerID, string checkword, MsgDataRequestIuopQueryOrder data, string accessToken = "", string environment = "bspgw")
        {
            /*	
            2.3. 请求参数<msgData>
            2.3.1 元素<请求>
            序号	属性名	类型(约束)	必填	默认值	描述
            1	customerCode	String	Y		客户编码
            2	version	String	N		版本号（默认为空即可）
            3	sfWaybillNo	String	N		顺丰运单号(母单号)，客户订单号customerOrderNo、 顺丰运单号sfWayBillNo至少填一个，如果两个都填写，校验是否为同一订单
            4	customerOrderNo	String	N		客户订单号，客户订单号customerOrderNo、 顺丰运单号sfWayBillNo至少填一个，如果两个都填写，校验是否为同一订单
            2.4. 公共响应参数
            #	属性名	类型(约束)	必填	默认值	描述
            1	success	String	是		true 请求成功，false 请求失败
            2	errorCode	String	是		错误编码，0成功
            3	errorMsg	String	是		错误描述
            4	msgData	Object	是		返回的详细数据
            2.5. 响应参数<msgData>
            2.5.1 元素<响应>
            #	属性名	类型(约束)	必填	描述
            1	customerOrderNo	String(64)		客户订单号
            2	customerOrderNoTwo	String(64)		客户订单号2
            3	sfWaybillNo	String(32)		顺丰运单号
            4	interProductCode	String(32)		国际产品映射码
            5	parcelQuantity	Int(8)		包裹总件数(大于1表示是子母件，最大值300)
            6	parcelTotalWeight	BigDecimal(16,2)		包裹总重量。精确到小数点后2位
            7	parcelWeightUnit	String(16)		包裹总重量单位
            8	parcelTotalLength	BigDecimal(16,2)		客户订单货物总长。精确到小数点后2位
            9	parcelTotalWidth	BigDecimal(16,2)		客户订单货物总宽。精确到小数点后2位
            10	parcelTotalHeight	BigDecimal(16,2)		客户订单货物总高。精确到小数点后2位
            11	declaredValue	String(20)		申明价值
            12	declaredCurrency	String(10)		包裹总计声明价值币种
            13	parcelVolumeUnit	String(16)		客户订单货物长度单位 1.可选项：CM、INCH 2.默认单位为CM 3.原寄国为CA和US，长度单位为英寸
            14	pickupType	String(2)		寄件方式 0-服务点自寄或自行联系快递员； 1-上门收件；
            15	pickupAppointTime	String(20)		上门取件预约时间。格式：yyyy-MM-dd HH:mm 若寄件方式选择了上门收件，则预约方式必填
            16	pickupAppointTimeZone	String(100)		上门预约时间时区 详细参考附录字典
            17	remark	String(200)		运单备注
            18	orderExtendInfo	OrderExtendInfo		订单额外信息
            19	paymentInfo	PaymentInfo		付款方式信息
            20	senderInfo	SenderInfo		寄件人信息
            21	receiverInfo	ReceiverInfo		收件人信息
            22	customsInfo	CustomsInfo		报关信息
            23	parcelInfoList	ParcelInfo		包裹信息
            24	addServiceInfoList	AddServiceInfo		增值服务信息
            25	childInfoList	ChildInfo		子单信息
            26	agentWaybillNo	String(40)		代理运单号
            2.5.1.1 元素OrderExtendInfo
            #	属性名	类型(约束)	必填	描述
            1	isSignBack	String(8)		是否要求签回单; 0.否 1.是（签回原寄地） 2.是（签回第三方地址）
            2	isSelfPick	String(8)		是否自取件：0-否；1-是
            3	signBackWaybillNo	String(32)		签回回单号
            4	preMergeSfWaybillNo	String(32)		BBD预合单号
            2.5.1.2 元素PaymentInfo
            #	属性名	类型(约束)	必填	描述
            1	payMethod	String(8)		付款方式：1-寄方付; 2-收方付; 3-第三方付
            2	payMonthCard	String(20)		月结卡号
            3	taxPayMethod	String(8)		税金付款方式：1-寄方付; 2-收方付; 3-第三方付
            4	taxPayMonthCard	String(20)		税金结算账号
            2.5.1.3 元素SenderInfo
            #	属性名	类型(约束)	必填	描述
            1	company	String(100)		寄件方公司
            2	contact	String(100)		寄件方姓名
            3	country	String(5)		寄件方国家/地区，如：CN,US,JP,KR,SG,MY 更多参考附录字典
            4	postCode	String(20)		邮编
            5	regionFirst	String(128)		寄件方地址一级区划（州/省）
            6	regionSecond	String(128)		寄件方地址二级区划（城市）
            7	regionThird	String(128)		寄件方地址三级区划（区/县）
            8	address	String(200)		寄件方详细地址
            9	email	String(128)		寄件方邮箱
            10	telAreaCode	String(10)		寄件方固定电话区号
            11	telNo	String(20)		寄件方固定电话。寄件方手机号和寄件方固定电话至少填写一个
            12	phoneAreaCode	String(10)		寄件方移动电话区号
            13	phoneNo	String(20)		寄件方移动电话。寄件方手机号和寄件方固定电话至少填写一个
            14	cargoType	INT(1)		寄件方货物类型：1-个人件；2-公司件
            15	certType	String(10)		寄件方证件类型 详细参考附录字典
            16	certCardNo	String(100)		寄件方证件号
            17	vat	String(18)		寄件方VAT号
            18	eori	String(100)		寄件方EORI号
            19	iossNo	String(100)		寄件方IOSS号
            2.5.1.4 元素ReceiverInfo
            #	属性名	类型(约束)	必填	描述
            1	company	String(100)		收件方公司
            2	contact	String(100)		收件方姓名
            3	country	String(5)		收件方国家/地区，如：CN,US,JP,KR,SG,MY 更多参考附录字典
            4	postCode	String(20)		邮编
            5	regionFirst	String(128)		收件方地址一级区划（州/省）
            6	regionSecond	String(128)		收件方地址二级区划（城市）
            7	regionThird	String(128)		收件方地址三级区划（区/县）
            8	address	String(200)		收件方详细地址
            9	regionFifth	String(200)		收件方地址五级区划（道路名，收件方国家为韩国，则必填，长度100）
            10	regionSixth	String(100)		收件方地址六级区划（建筑编号，收件方国家为韩国，则必填）
            11	email	String(128)		收件方邮箱
            12	telAreaCode	String(10)		收件方固定电话区号
            13	telNo	String(20)		收件方固定电话。收件方手机号和收件方固定电话至少填写一个
            14	phoneAreaCode	String(10)		收件方移动电话区号
            15	phoneNo	String(20)		收件方移动电话。收件方手机号和收件方固定电话至少填写一个
            16	cargoType	INT(1)		收件方货物类型：1-个人件；2-公司件
            17	certType	String(10)		收件方证件类型 详细参考附录字典
            18	certCardNo	String(100)		收件方证件号
            19	vat	String(18)		收件方VAT号
            20	eori	String(100)		收件方EORI号
            2.5.1.5 元素CustomsInfo
            #	属性名	类型(约束)	必填	描述
            1	tradeCondition	String(30)		贸易条件，参考附录字典
            2	senderReason	Int(2)		寄件原因：1-商业；2-非商业
            3	senderReasonContent	String(256)		寄件原因内容
            4	businessRemark	String(256)		商业发票备注
            5	customsBatch	String(20)		报关批次
            6	importCustomsType	String(30)		进口报关方式 参考附录字典
            7	exportCustomsType	String(30)		出口报关方式 参考附录字典
            8	harmonizedCode	String(100)		Harmonized Code美国寄出的可填写
            9	aesNo	String(100)		AES No.美国寄出可填写
            2.5.1.6 元素ParcelInfo
            #	属性名	类型(约束)	必填	描述
            1	name	String(128)		商品名称
            2	eName	String(128)		商品英文名称
            3	unit	String(32)		货物单位
            4	amount	DECIMAL(24,10)		单价
            5	quantity	DECIMAL(16,6)		数量
            6	originCountry	String(5)		原产国家
            7	hsCode	String(100)		海关编码
            8	brand	String(16)		品牌
            9	stateBarCode	String(64)		国条码
            10	productCustomsNo	String(100)		海关备案号
            11	productRecordNo	String(18)		货物产品国检备案编号
            12	goodsCode	String(60)		商品编号
            13	goodsUrl	String(2000)		商品链接
            14	weight	DECIMAL(16,3)		托寄物重量
            15	goodsDesc	String(200)		商品描述
            16	material	String(600)		材质
            17	specifications	String(64)		型号
            2.5.1.7 元素AddServiceInfo
            #	属性名	类型(约束)	必填	描述
            1	serviceCode	String(32)		增值服务编码
            2	value	String(256)		增值服务扩展属性
            3	valueOne	String(256)		增值服务扩展属性1
            2.5.1.8 元素ChildInfo
            #	属性名	类型(约束)	必填	描述
            1	sfWaybillNo	String(32)		子单编号
            2.6. 请求示例\应用场景(JSON)示例
            请求报文:（msgData字段）:

            {
                "customerCode": "ICRME000SRN93",
                "sfWaybillNo": "SF1334456901862"
            }
            2.7. 返回示例\应用场景(JSON)示例
            响应报文:

            成功响应:
            {
                "success": true,
                "errorCode": "0",
                "errorMsg": null,
                "msgData": {
                    "addServiceInfoList": [
                        {
                            "serviceCode": "IN15",
                            "valueOne": "",
                            "value": ""
                        }
                    ],
                    "pickupAppointTimeZone": "",
                    "interProductCode": "INT0007",
                    "parcelQuantity": 1,
                    "customsInfo": {
                        "businessRemark": "",
                        "senderReasonContent": "",
                        "tradeCondition": "",
                        "aesNo": "",
                        "customsBatch": "",
                        "harmonizedCode": "",
                        "importCustomsType": "",
                        "exportCustomsType": ""
                    },
                    "childInfoList": [],
                    "receiverInfo": {
                        "cargoType": 1,
                        "country": "SG",
                        "certType": "",
                        "address": "新加坡 详细地址",
                        "regionSixth": "regionSixth11",
                        "vat": "",
                        "telAreaCode": "86",
                        "regionFifth": "regionFifth11",
                        "regionSecond": "106A",
                        "eori": "",
                        "phoneNo": "123",
                        "telNo": "9516168888",
                        "phoneAreaCode": "65",
                        "certCardNo": "",
                        "regionFirst": "Ah Soo Walk",
                        "contact": "李想",
                        "company": "顺丰速运",
                        "postCode": "536727",
                        "regionThird": "regionThird11",
                        "email": "iuop@test.com"
                    },
                    "remark": "",
                    "agentWaybillNo": "",
                    "customerOrderNoTwo": "",
                    "pickupType": "0",
                    "orderExtendInfo": {
                        "isSignBack": "",
                        "isSelfPick": "",
                        "signBackWaybillNo": ""
                    },
                    "parcelWeightUnit": "KG",
                    "parcelInfoList": [
                        {
                            "amount": 0.1,
                            "quantity": 1,
                            "eName": "",
                            "stateBarCode": "",
                            "specifications": "",
                            "unit": "个",
                            "goodsUrl": "",
                            "hsCode": "",
                            "material": "",
                            "name": "iPhone",
                            "originCountry": "SG",
                            "goodsCode": "",
                            "brand": "",
                            "productCustomsNo": "",
                            "productRecordNo": "",
                            "goodsDesc": ""
                        }
                    ],
                    "declaredCurrency": "USD",
                    "parcelTotalWeight": 0.5,
                    "pickupAppointTime": "",
                    "senderInfo": {
                        "cargoType": 1,
                        "country": "SG",
                        "certType": "",
                        "address": "306 S BRYN MAWR AVE",
                        "regionSixth": "",
                        "vat": "",
                        "telAreaCode": "86",
                        "regionFifth": "",
                        "regionSecond": "11A",
                        "eori": "",
                        "phoneNo": "123",
                        "telNo": "9516168888",
                        "phoneAreaCode": "65",
                        "certCardNo": "",
                        "regionFirst": "Admiralty Road East",
                        "contact": "姓名测试",
                        "company": "",
                        "postCode": "759973",
                        "regionThird": "regionThird11",
                        "email": "iuop@test.com"
                    },
                    "parcelVolumeUnit": "CM",
                    "customerOrderNo": "1658385192825149",
                    "declaredValue": 0.1,
                    "paymentInfo": {
                        "taxPayMonthCard": "",
                        "payMethod": "1",
                        "taxPayMethod": "2",
                        "payMonthCard": ""
                    },
                    "sfWaybillNo": "SF1334456901862"
                }
            }
            失败响应：
            {
                "success": false,
                "errorCode": "123052",
                "errorMsg": "",
                "msgData": null
            }
            */
            string errcode = "";
            string errmsg = "";
            string resultdata = "";

            string serviceCode = "COM_RECE_IUOP_QUERY_ORDER";
            string msgData = SFCommon.JsonCompress(JsonHelper.SerializeObject(data));
            string timestamp = SFCommon.GetTimeStamp(); //获取时间戳
            string requestID = Guid.NewGuid().ToString(); //获取uuid

            Dictionary<string, string> content = new Dictionary<string, string>();
            content["partnerID"] = partnerID;
            content["requestID"] = requestID;
            content["serviceCode"] = serviceCode;
            content["timestamp"] = timestamp;
            if (!string.IsNullOrWhiteSpace(accessToken))
            {
                content["accessToken"] = accessToken;
            }
            else
            {
                string msgDigest = SFCommon.MD5ToBase64String(SFCommon.UrlEncode(msgData + timestamp + checkword));
                content["msgDigest"] = msgDigest;
            }
            content["msgData"] = msgData;

            var result = HttpHelper.GetResponseApiResultData(content, null, environment);
            if (result != null)
            {
                if (result.apiResultCode == "A1000")
                {
                    var msgDataResponse = JsonHelper.DeserializeObject<ResponseIuopQueryOrder>(result.apiResultData);
                    if (msgDataResponse != null)
                    {
                        errmsg = msgDataResponse.errorMsg;
                        resultdata = JsonHelper.SerializeObject(msgDataResponse.msgData);
                        if (msgDataResponse.success)
                        {
                            errcode = "0";
                        }
                        else
                        {
                            errcode = msgDataResponse.errorCode;
                        }
                    }
                    else
                    {
                        errcode = "-2";
                        errmsg = "未返回业务数据";
                        resultdata = "";
                    }
                }
                else
                {
                    errcode = result.apiResultCode;
                    errmsg = result.apiErrorMsg;
                    resultdata = result.apiResultData;
                }
            }
            else
            {
                errcode = "-1";
                errmsg = "接口未返回内容";
                resultdata = "";
            }

            return new JsonResult
            {
                errcode = errcode,
                errmsg = errmsg,
                data = resultdata
            };
        }

        /// <summary>
        /// 取消物流订单
        /// 取消已创建的订单
        /// </summary>
        /// <param name="partnerID"></param>
        /// <param name="checkword"></param>
        /// <param name="data">业务数据报文 json字符串</param>
        /// <param name="environment">调用环境，bspgw：生产环境；sfapi-hk：香港生产环境；sfapi-sbox：沙箱环境</param>
        /// <returns></returns>
        public static JsonResult IuopCancelOrder(string partnerID, string checkword, MsgDataRequestIuopCancelOrder data, string accessToken = "", string environment = "bspgw")
        {
            /*	
            2.3. 请求参数<msgData>
            2.3.1 元素<请求>
            序号	属性名	类型(约束)	必填	默认值	描述
            1	customerCode	String(50)	Y		客户编码
            2	sfWaybillNo	String(32)	N		顺丰运单号(母单号),顺丰运单号与客户订单号二者填其一
            3	customerOrderNo	String(64)	N		客户订单号,顺丰运单号与客户订单号二者填其一
            2.4. 公共响应参数
            #	属性名	类型(约束)	必填	默认值	描述
            1	success	String	是		true 请求成功，false 请求失败
            2	errorCode	String	是		错误编码，0成功
            3	errorMsg	String	是		错误描述
            4	msgData	Object	是		返回的详细数据
            2.6. 请求示例\应用场景(JSON)示例
            请求报文:（msgData字段）:

            {
                "customerCode": "ICRME000SRN93",
                "sfWaybillNo": "SF1324476054891"
            }
            2.7. 返回示例\应用场景(JSON)示例
            响应报文:

            成功响应:
            {
                "success": true,
                "errorCode": "0",
                "errorMsg": null,
                "msgData": null
            }
            失败响应：
            {
                "success": false,
                "errorCode": "123052",
                "errorMsg": "",
                "msgData": null
            }
            */
            string errcode = "";
            string errmsg = "";
            string resultdata = "";

            string serviceCode = "COM_RECE_IUOP_CANCEL_ORDER";
            string msgData = SFCommon.JsonCompress(JsonHelper.SerializeObject(data));
            string timestamp = SFCommon.GetTimeStamp(); //获取时间戳
            string requestID = Guid.NewGuid().ToString(); //获取uuid

            Dictionary<string, string> content = new Dictionary<string, string>();
            content["partnerID"] = partnerID;
            content["requestID"] = requestID;
            content["serviceCode"] = serviceCode;
            content["timestamp"] = timestamp;
            if (!string.IsNullOrWhiteSpace(accessToken))
            {
                content["accessToken"] = accessToken;
            }
            else
            {
                string msgDigest = SFCommon.MD5ToBase64String(SFCommon.UrlEncode(msgData + timestamp + checkword));
                content["msgDigest"] = msgDigest;
            }
            content["msgData"] = msgData;

            var result = HttpHelper.GetResponseApiResultData(content, null, environment);
            if (result != null)
            {
                if (result.apiResultCode == "A1000")
                {
                    var msgDataResponse = JsonHelper.DeserializeObject<ResponseIuopCancelOrder>(result.apiResultData);
                    if (msgDataResponse != null)
                    {
                        errmsg = msgDataResponse.errorMsg;
                        if (msgDataResponse.success)
                        {
                            errcode = "0";
                        }
                        else
                        {
                            errcode = msgDataResponse.errorCode;
                        }
                    }
                    else
                    {
                        errcode = "-2";
                        errmsg = "未返回业务数据";
                        resultdata = "";
                    }
                }
                else
                {
                    errcode = result.apiResultCode;
                    errmsg = result.apiErrorMsg;
                    resultdata = result.apiResultData;
                }
            }
            else
            {
                errcode = "-1";
                errmsg = "接口未返回内容";
                resultdata = "";
            }

            return new JsonResult
            {
                errcode = errcode,
                errmsg = errmsg,
                data = resultdata
            };
        }

        /// <summary>
        /// 上传清关资料
        /// 清关证件或资料上传接口， 支持上传的文件格式为PNG，JPG，PDF，单个文件/照片必须小于3M。 除身份证、护照和其他证件外，其余的证件类型均支持pdf格式。
        /// </summary>
        /// <param name="partnerID"></param>
        /// <param name="checkword"></param>
        /// <param name="data">业务数据报文 json字符串</param>
        /// <param name="environment">调用环境，bspgw：生产环境；sfapi-hk：香港生产环境；sfapi-sbox：沙箱环境</param>
        /// <returns></returns>
        public static JsonResult IuopUploadCertify(string partnerID, string checkword, MsgDataRequestIuopUploadCertify data, string accessToken = "", string environment = "bspgw")
        {
            /*
            2.3. 请求参数<msgData>
            2.3.1 元素<请求>
            序号	属性名	类型(约束)	必填	默认值	描述
            1	customerCode	String(50)	Y		客户编码
            2	version	String(10)	N		版本号（默认为空即可）
            3	sfWaybillNo	String(32)	N		顺丰运单号(母单号),顺丰运单号与客户订单号二者填其一
            4	customerOrderNo	String(64)	N		客户订单号,顺丰运单号与客户订单号二者填其一
            5	certType	String	Y		参考附录 “证件类型声明” 以及 “报关资料类型”
            身份证类型需上传正反面2张图片
            6	fileFormat	String	N		文件格式（JPG、PNG、PDF）
            7	fileContent	String	N		文件内容（Base64编码） 若证件类型是身份证，此字段建议为身份证正面
            8	fileContentTwo	String	N		文件内容（Base64编码） 若证件类型是身份证，此字段建议为身份证反面
            9	certName	String(100)	N		证件姓名
            10	certCardNo	String(100)	N		证件号码
            11	cretsFlag	String	N		证件归属：0-收方，1-寄方
            2.4. 公共响应参数
            #	属性名	类型(约束)	必填	默认值	描述
            1	success	String	是		true 请求成功，false 请求失败
            2	errorCode	String	是		错误编码，0成功
            3	errorMsg	String	是		错误描述
            4	msgData	Object	是		返回的详细数据
            2.6. 请求示例\应用场景(JSON)示例
            请求报文:（msgData字段）:

            {
                "certCardNo": "330381199408080924",
                "certName": "李三",
                "certType": "001",
                "customerCode": "ICRM-CN002WSQ78",
                "customerOrderNo": "",
                "fileContent": "/9j/4AAQSkZJRgABAQAAAQABAAD/2wBDACodICUgGiolIiUvLSoyP2lEPzo6P4FcYUxpmYagnpaGk5...",
                "fileContentTwo": "/9j/4AAQSkZJRgABAQAAAQABAAD/2wBDAD0qLjYuJj02MjZFQT1JXJpkXFRUXLyGjm+a38Tq5tv...",
                "fileFormat": "jpg",
                "sfWaybillNo": "SF1334451527920",
                "version": "1"
            }
            2.7. 返回示例\应用场景(JSON)示例
            响应报文:

            成功响应:
            {
                "code": "0",
                "msg": "执行成功",
                "success": true
            }
            失败响应：
            {
                "success": false,
                "errorCode": "123052",
                "errorMsg": "",
                "msgData": null
            }
            */
            string errcode = "";
            string errmsg = "";
            string resultdata = "";

            string serviceCode = "COM_RECE_IUOP_UPLOAD_CERTIFY";
            string msgData = SFCommon.JsonCompress(JsonHelper.SerializeObject(data));
            string timestamp = SFCommon.GetTimeStamp(); //获取时间戳
            string requestID = Guid.NewGuid().ToString(); //获取uuid

            Dictionary<string, string> content = new Dictionary<string, string>();
            content["partnerID"] = partnerID;
            content["requestID"] = requestID;
            content["serviceCode"] = serviceCode;
            content["timestamp"] = timestamp;
            if (!string.IsNullOrWhiteSpace(accessToken))
            {
                content["accessToken"] = accessToken;
            }
            else
            {
                string msgDigest = SFCommon.MD5ToBase64String(SFCommon.UrlEncode(msgData + timestamp + checkword));
                content["msgDigest"] = msgDigest;
            }
            content["msgData"] = msgData;

            var result = HttpHelper.GetResponseApiResultData(content, null, environment);
            if (result != null)
            {
                if (result.apiResultCode == "A1000")
                {
                    var msgDataResponse = JsonHelper.DeserializeObject<ResponseIuopUploadCertify>(result.apiResultData);
                    if (msgDataResponse != null)
                    {
                        errmsg = msgDataResponse.errorMsg;
                        if (msgDataResponse.success)
                        {
                            errcode = "0";
                        }
                        else
                        {
                            errcode = msgDataResponse.errorCode;
                        }
                    }
                    else
                    {
                        errcode = "-2";
                        errmsg = "未返回业务数据";
                        resultdata = "";
                    }
                }
                else
                {
                    errcode = result.apiResultCode;
                    errmsg = result.apiErrorMsg;
                    resultdata = result.apiResultData;
                }
            }
            else
            {
                errcode = "-1";
                errmsg = "接口未返回内容";
                resultdata = "";
            }

            return new JsonResult
            {
                errcode = errcode,
                errmsg = errmsg,
                data = resultdata
            };
        }

        /// <summary>
        /// 清关资料是否有效查询
        /// 查询证件在顺丰关务系统中是否存在
        /// </summary>
        /// <param name="partnerID"></param>
        /// <param name="checkword"></param>
        /// <param name="data">业务数据报文 json字符串</param>
        /// <param name="environment">调用环境，bspgw：生产环境；sfapi-hk：香港生产环境；sfapi-sbox：沙箱环境</param>
        /// <returns></returns>
        public static JsonResult IuopValidityCertify(string partnerID, string checkword, MsgDataRequestIuopValidityCertify data, string accessToken = "", string environment = "bspgw")
        {
            /*
            2.3. 请求参数<msgData>
            2.3.1 元素<请求>
            序号	属性名	类型(约束)	必填	默认值	描述
            1	version	String	N		版本号（默认为空即可）
            2	userName	String	Y		客户姓名
            3	cardNo	String	N		证件号
            4	telPhone	String	N		客户电话
            2.4. 公共响应参数
            #	属性名	类型(约束)	必填	默认值	描述
            1	success	String	是		true 请求成功，false 请求失败
            2	errorCode	String	是		错误编码，0成功
            3	errorMsg	String	是		错误描述
            4	msgData	Boolean	是		返回的详细数据
            2.6. 请求示例\应用场景(JSON)示例
            请求报文:（msgData字段）:

            {
                "cardNo": "3303811995090807212",
                "telPhone": "95338",
                "userName": "李三"
            }
            2.7. 返回示例\应用场景(JSON)示例
            响应报文:

            成功响应:
            {
                "success": true,
                "errorCode": "0",
                "errorMsg": null,
                "msgData": true
            }
            失败响应：
            {
                "success": false,
                "errorCode": "123052",
                "errorMsg": "",
                "msgData": null
            }
            */
            string errcode = "";
            string errmsg = "";
            string resultdata = "";

            string serviceCode = "COM_RECE_IUOP_VALIDITY_CERTIFY";
            string msgData = SFCommon.JsonCompress(JsonHelper.SerializeObject(data));
            string timestamp = SFCommon.GetTimeStamp(); //获取时间戳
            string requestID = Guid.NewGuid().ToString(); //获取uuid

            Dictionary<string, string> content = new Dictionary<string, string>();
            content["partnerID"] = partnerID;
            content["requestID"] = requestID;
            content["serviceCode"] = serviceCode;
            content["timestamp"] = timestamp;
            if (!string.IsNullOrWhiteSpace(accessToken))
            {
                content["accessToken"] = accessToken;
            }
            else
            {
                string msgDigest = SFCommon.MD5ToBase64String(SFCommon.UrlEncode(msgData + timestamp + checkword));
                content["msgDigest"] = msgDigest;
            }
            content["msgData"] = msgData;

            var result = HttpHelper.GetResponseApiResultData(content, null, environment);
            if (result != null)
            {
                if (result.apiResultCode == "A1000")
                {
                    var msgDataResponse = JsonHelper.DeserializeObject<ResponseIuopValidityCertify>(result.apiResultData);
                    if (msgDataResponse != null)
                    {
                        errmsg = msgDataResponse.errorMsg;
                        resultdata = JsonHelper.SerializeObject(msgDataResponse.msgData);
                        if (msgDataResponse.success)
                        {
                            errcode = "0";
                        }
                        else
                        {
                            errcode = msgDataResponse.errorCode;
                        }
                    }
                    else
                    {
                        errcode = "-2";
                        errmsg = "未返回业务数据";
                        resultdata = "";
                    }
                }
                else
                {
                    errcode = result.apiResultCode;
                    errmsg = result.apiErrorMsg;
                    resultdata = result.apiResultData;
                }
            }
            else
            {
                errcode = "-1";
                errmsg = "接口未返回内容";
                resultdata = "";
            }

            return new JsonResult
            {
                errcode = errcode,
                errmsg = errmsg,
                data = resultdata
            };
        }

        /// <summary>
        /// 上传清关资料要求查询
        /// 清关证件或资料上传要求查询接口
        /// 详细说明已上传和需要上传的证件的资料信息，以及上传资料的提示信息
        /// </summary>
        /// <param name="partnerID"></param>
        /// <param name="checkword"></param>
        /// <param name="data">业务数据报文 json字符串</param>
        /// <param name="environment">调用环境，bspgw：生产环境；sfapi-hk：香港生产环境；sfapi-sbox：沙箱环境</param>
        /// <returns></returns>
        public static JsonResult IuopRequireCertify(string partnerID, string checkword, MsgDataRequestIuopRequireCertify data, string accessToken = "", string environment = "bspgw")
        {
            /*
            2.3. 请求参数<msgData>
            2.3.1 元素<请求>
            序号	属性名	类型(约束)	必填	默认值	描述
            1	customerCode	String(50)	Y		客户编码
            2	version	String(10)	N		版本号（默认为空即可）
            3	requestId	String(64)	Y		请求id（可使用UUID，确保请求唯一性字段，只要确保每个请求的requestId唯一即可）
            4	sfWaybillNo	String(32)	N		顺丰运单号，客户订单号和顺丰运单号不能同时为空
            5	customerOrderNo	String(64)	N		客户订单号，客户订单号和顺丰运单号不能同时为空
            2.4. 公共响应参数
            #	属性名	类型(约束)	必填	默认值	描述
            1	success	String	是		true 请求成功，false 请求失败
            2	errorCode	String	是		错误编码，0成功
            3	errorMsg	String	是		错误描述
            4	msgData	Object	是		返回的详细数据
            2.5. 响应参数<msgData>
            2.5.1 元素<响应>
            #	属性名	类型(约束)	必填	描述
            1	cusCertsInfoList	List<CusCertsInfoDto>		需上传证件的要求
            2	uploadedCertsInfoList	List<UploadStatisticsCertDto>		已上传证件
            3	tips	String		温馨提示
            2.5.1.1 元素CusCertsInfoDto
            #	属性名	类型(约束)	必填	描述
            1	ieFlag	String		进出口标识
            2	certType	String		单证类型（报关资料(I) 报关证件©）
            3	cretsFlag	String		单证归属, 0-收方,1-寄方
            4	cusCertGroupInfoDtoList	List<CusCertGroupInfoDto>		需上传证件详细规则
            2.5.1.1.1 元素CusCertGroupInfoDto
            #	属性名	类型(约束)	必填	描述
            1	ieFlag	String		进出口标识
            2	certType	String		单证类型（报关资料(I) 报关证件©）
            3	cretsFlag	String		单证归属, 0-收方,1-寄方
            4	cusCertGroupInfoDtoList	List<CusCertGroupInfoDto>		需上传证件详细规则
            2.5.1.1.1.1 元素CusCertGroupInfoDto
            #	属性名	类型(约束)	必填	描述
            1	certState	String		单证提示说明（需要根据语言）
            2	needNums	Integer		所需单证名称数量 (needNums=-1，表示仅提示；needNums=0，表示选填；needNums=2，表示这几个里面必须上传2项；)
            3	cusCertsDetailDtolist	List<CusCertsDetailDto>		单证名称
            2.5.1.2 元素UploadStatisticsCertDto
            #	属性名	类型(约束)	必填	描述
            1	certNameId	String		单证名称ID
            2	certName	String		单证名称(需要根据语言)
            3	certDescription	String		单证描述(需要根据语言)
            4	telUpload	String		是否上传号码（1：上传，0：无需上传）
            5	imageUpload	String		是否上传图片（0：无需上传，1：需上传，2：已上传需审核， 3：已上传无需审核）
            6	certAmount	Integer		上传单证图片的最小数量(上传图片时必填)
            7	certMaxAmount	Integer		上传单证图片的最大数量(上传图片时必填)
            2.6. 请求示例\应用场景(JSON)示例
            请求报文:（msgData字段）:

            {
                "customerCode": "ICRME000SRN93",
                "requestId": "16232272226916",
                "sfWaybillNo": "SF1342602425144"
            }
            2.7. 返回示例\应用场景(JSON)示例
            响应报文:

            成功响应:
            {
                "success": true,
                "errorCode": "0",
                "errorMsg": null,
                "msgData": {
                    "cusCertsInfoList": [],
                    "tips": "订单无需上传图片",
                    "uploadedCertsInfoList": []
                }
            }
            失败响应：
            {
                "success": false,
                "errorCode": "123052",
                "errorMsg": "",
                "msgData": null
            }
            */
            string errcode = "";
            string errmsg = "";
            string resultdata = "";

            string serviceCode = "COM_RECE_IUOP_REQUIRE_CERTIFY";
            string msgData = SFCommon.JsonCompress(JsonHelper.SerializeObject(data));
            string timestamp = SFCommon.GetTimeStamp(); //获取时间戳
            string requestID = Guid.NewGuid().ToString(); //获取uuid

            Dictionary<string, string> content = new Dictionary<string, string>();
            content["partnerID"] = partnerID;
            content["requestID"] = requestID;
            content["serviceCode"] = serviceCode;
            content["timestamp"] = timestamp;
            if (!string.IsNullOrWhiteSpace(accessToken))
            {
                content["accessToken"] = accessToken;
            }
            else
            {
                string msgDigest = SFCommon.MD5ToBase64String(SFCommon.UrlEncode(msgData + timestamp + checkword));
                content["msgDigest"] = msgDigest;
            }
            content["msgData"] = msgData;

            var result = HttpHelper.GetResponseApiResultData(content, null, environment);
            if (result != null)
            {
                if (result.apiResultCode == "A1000")
                {
                    var msgDataResponse = JsonHelper.DeserializeObject<ResponseIuopRequireCertify>(result.apiResultData);
                    if (msgDataResponse != null)
                    {
                        errmsg = msgDataResponse.errorMsg;
                        resultdata = JsonHelper.SerializeObject(msgDataResponse.msgData);
                        if (msgDataResponse.success)
                        {
                            errcode = "0";
                        }
                        else
                        {
                            errcode = msgDataResponse.errorCode;
                        }
                    }
                    else
                    {
                        errcode = "-2";
                        errmsg = "未返回业务数据";
                        resultdata = "";
                    }
                }
                else
                {
                    errcode = result.apiResultCode;
                    errmsg = result.apiErrorMsg;
                    resultdata = result.apiResultData;
                }
            }
            else
            {
                errcode = "-1";
                errmsg = "接口未返回内容";
                resultdata = "";
            }

            return new JsonResult
            {
                errcode = errcode,
                errmsg = errmsg,
                data = resultdata
            };
        }

        /// <summary>
        /// 预估运费
        /// 根据客户编码及费用查询对象预估运费信息
        /// 注意：未包含其他附加费用
        /// </summary>
        /// <param name="partnerID"></param>
        /// <param name="checkword"></param>
        /// <param name="data">业务数据报文 json字符串</param>
        /// <param name="environment">调用环境，bspgw：生产环境；sfapi-hk：香港生产环境；sfapi-sbox：沙箱环境</param>
        /// <returns></returns>
        public static JsonResult IuopQueryFreight(string partnerID, string checkword, MsgDataRequestIuopQueryFreight data, string accessToken = "", string environment = "bspgw")
        {
            /*
            2.3. 请求参数<msgData>
            2.3.1 元素<请求>
            序号	属性名	类型(约束)	必填	默认值	描述
            1	customerCode	String(50)	Y		客户编码
            2	version	String(10)	N		版本号（默认为空即可）
            3	senderCountry	String	Y		寄件国家/地区的二字码 采用ISO 3166 标准 Alpha-2 code 如：CN,US,JP,KR,SG,MY
            4	receiverCountry	String	Y		收件国家/地区的二字码 采用ISO 3166 标准 Alpha-2 code 如：CN,US,JP,KR,SG,MY
            5	senderPostCode	String	Y		寄方邮编
            6	receiverPostCode	String	Y		到方邮编
            7	interProductCode	String	Y		产品统一映射码
            8	payMonthCard	String	N		月结账号
            9	consignedTm	Date	N		寄件时间,YYYY-MM-DD HH:mm:ss（默认当前时间）
            10	weight	String	Y		实际重量（KG）
            11	currency	String	N		币种，传入则按该币种返回费用
            2.4. 公共响应参数
            #	属性名	类型(约束)	必填	默认值	描述
            1	success	String	是		true 请求成功，false 请求失败
            2	errorCode	String	是		错误编码，0成功
            3	errorMsg	String	是		错误描述
            4	msgData	Object	是		返回的详细数据
            2.5. 响应参数<msgData>
            2.5.1 元素<响应>
            #	属性名	类型(约束)	必填	描述
            1	currency	String		币种
            2	totalFreight	String		总费用
            3	weight	String		重量
            4	discountedRate	String		折扣运费
            2.6. 请求示例\应用场景(JSON)示例
            请求报文:（msgData字段）:

            {
                "customerCode": "ICRME000SRN93",
                "interProductCode": "INT0007",
                "receiverCountry": "SG",
                "receiverPostCode": "499938",
                "senderCountry": "CN",
                "senderPostCode": "518052",
                "weight": "12.01"
            }
            2.7. 返回示例\应用场景(JSON)示例
            响应报文:

            成功响应:
            {
                "success": true,
                "errorCode": "0",
                "errorMsg": null,
                "msgData": {
                    "totalFreight": "125",
                    "weight": "12.5",
                    "currency": "CNY"
                }
            }
            失败响应：
            {
                "success": false,
                "errorCode": "123052",
                "errorMsg": "",
                "msgData": null
            }
            */
            string errcode = "";
            string errmsg = "";
            string resultdata = "";

            string serviceCode = "COM_RECE_IUOP_QUERY_FREIGHT";
            string msgData = SFCommon.JsonCompress(JsonHelper.SerializeObject(data));
            string timestamp = SFCommon.GetTimeStamp(); //获取时间戳
            string requestID = Guid.NewGuid().ToString(); //获取uuid

            Dictionary<string, string> content = new Dictionary<string, string>();
            content["partnerID"] = partnerID;
            content["requestID"] = requestID;
            content["serviceCode"] = serviceCode;
            content["timestamp"] = timestamp;
            if (!string.IsNullOrWhiteSpace(accessToken))
            {
                content["accessToken"] = accessToken;
            }
            else
            {
                string msgDigest = SFCommon.MD5ToBase64String(SFCommon.UrlEncode(msgData + timestamp + checkword));
                content["msgDigest"] = msgDigest;
            }
            content["msgData"] = msgData;

            var result = HttpHelper.GetResponseApiResultData(content, null, environment);
            if (result != null)
            {
                if (result.apiResultCode == "A1000")
                {
                    var msgDataResponse = JsonHelper.DeserializeObject<ResponseIuopQueryFreight>(result.apiResultData);
                    if (msgDataResponse != null)
                    {
                        errmsg = msgDataResponse.errorMsg;
                        resultdata = JsonHelper.SerializeObject(msgDataResponse.msgData);
                        if (msgDataResponse.success)
                        {
                            errcode = "0";
                        }
                        else
                        {
                            errcode = msgDataResponse.errorCode;
                        }
                    }
                    else
                    {
                        errcode = "-2";
                        errmsg = "未返回业务数据";
                        resultdata = "";
                    }
                }
                else
                {
                    errcode = result.apiResultCode;
                    errmsg = result.apiErrorMsg;
                    resultdata = result.apiResultData;
                }
            }
            else
            {
                errcode = "-1";
                errmsg = "接口未返回内容";
                resultdata = "";
            }

            return new JsonResult
            {
                errcode = errcode,
                errmsg = errmsg,
                data = resultdata
            };
        }

        /// <summary>
        /// 异步打印面单
        /// 客户可以通过运单号获取运单和发票的打印文件。 异步打印会返回打印请求id，需要调用方根据打印请求id查询打印结果url。
        /// 注意：目前创建物流订单接口返回信息中已包含面单的下载链接，通常无需专门对接此接口获取面单
        /// </summary>
        /// <param name="partnerID"></param>
        /// <param name="checkword"></param>
        /// <param name="data">业务数据报文 json字符串</param>
        /// <param name="environment">调用环境，bspgw：生产环境；sfapi-hk：香港生产环境；sfapi-sbox：沙箱环境</param>
        /// <returns></returns>
        public static JsonResult IuopAsynPrintOrder(string partnerID, string checkword, MsgDataRequestIuopAsynPrintOrder data, string accessToken = "", string environment = "bspgw")
        {
            /*
            2.3. 请求参数<msgData>
            2.3.1 元素<请求>
            序号	属性名	类型(约束)	必填	默认值	描述
            1	customerCode	String(50)	Y		客户编码
            2	requestId	String(64)	Y		请求id（可使用UUID，确保请求唯一性字段，只要确保每个请求的requestId唯一即可）
            3	version	String(10)	N		版本号（默认为空即可）
            4	labelModeSize	Integer	N		面单打印样式；
            0：面单类100*210；
            1：面单类100*150；
            2：面单类100*45（BBD合单包裹条形码）
            3：面单类，100*150(捡货面单)
            4：面单类，100*210(捡货面单)
            5：面单类，100*45(参考编号面单)
            7：面单类100*45(BBD合单包裹二维码)
            8：面单类100*45(BBD预合单大包裹条形码)
            printType=1时默认值为1，printType=2时默认值为0
            5	printType	String(8)	Y		打印类型。1-运单 2-发票
            6	printWaybillNoDtoList	List<PrintWaybillNoDto>	Y		支持批量打印 母单相同的子单（含母单） 打印参数对象
            7	fileFormat	String(8)	Y		打印文件格式：PDF或者ZPL；默认为PDF
            8	resolution	String(5)	Y		ZPL文件分辨率，支持203dpi和300dpi，仅在fileFormat为ZPL时有效
            2.3.1.1 元素<请求> PrintWaybillNoDto
            序号	属性名	类型(约束)	必填	默认值	描述
            1	sfWaybillNo	String(32)	Y		顺丰运单号
            2	isPrintSubParent	Integer	N		是否打印全部的子母单 0：否 1：是 默认值：0
            3	singlePrintWaybillNoList	List<String>	N		单独打印的运单号集合(含母单，子单)；若isPrintSubParent 为0，则必填
            2.4. 公共响应参数
            #	属性名	类型(约束)	必填	默认值	描述
            1	success	String	是		true 请求成功，false 请求失败
            2	errorCode	String	是		错误编码，0成功
            3	errorMsg	String	是		错误描述
            4	msgData	Object	是		返回的详细数据
            2.5. 响应参数<msgData>
            2.5.1 元素<响应>
            #	属性名	类型(约束)	必填	描述
            1	printRequestId	String		打印请求id
            2.6. 请求示例\应用场景(JSON)示例
            请求报文:（msgData字段）:

            {
                "customerCode": "ICRME000SRN93",
                "labelModeSize": 0,
                "printType": "1",
                "printWaybillNoDtoList": [
                    {
                        "isPrintSubParent": 1,
                        "sfWaybillNo": "SF1030358177716"
                    }
                ]
            }
            2.7. 返回示例\应用场景(JSON)示例
            响应报文:

            成功响应:
            {
                "success": true,
                "errorCode": "0",
                "errorMsg": null,
                "msgData": {
                    "printRequestId": "123"
                }
            }
            失败响应：
            {
                "success": false,
                "errorCode": "123052",
                "errorMsg": "",
                "msgData": null
            }
            */
            string errcode = "";
            string errmsg = "";
            string resultdata = "";

            string serviceCode = "COM_RECE_IUOP_ASYN_PRINT_ORDER";
            string msgData = SFCommon.JsonCompress(JsonHelper.SerializeObject(data));
            string timestamp = SFCommon.GetTimeStamp(); //获取时间戳
            string requestID = Guid.NewGuid().ToString(); //获取uuid

            Dictionary<string, string> content = new Dictionary<string, string>();
            content["partnerID"] = partnerID;
            content["requestID"] = requestID;
            content["serviceCode"] = serviceCode;
            content["timestamp"] = timestamp;
            if (!string.IsNullOrWhiteSpace(accessToken))
            {
                content["accessToken"] = accessToken;
            }
            else
            {
                string msgDigest = SFCommon.MD5ToBase64String(SFCommon.UrlEncode(msgData + timestamp + checkword));
                content["msgDigest"] = msgDigest;
            }
            content["msgData"] = msgData;

            var result = HttpHelper.GetResponseApiResultData(content, null, environment);
            if (result != null)
            {
                if (result.apiResultCode == "A1000")
                {
                    var msgDataResponse = JsonHelper.DeserializeObject<ResponseIuopAsynPrintOrder>(result.apiResultData);
                    if (msgDataResponse != null)
                    {
                        errmsg = msgDataResponse.errorMsg;
                        resultdata = JsonHelper.SerializeObject(msgDataResponse.msgData);
                        if (msgDataResponse.success)
                        {
                            errcode = "0";
                        }
                        else
                        {
                            errcode = msgDataResponse.errorCode;
                        }
                    }
                    else
                    {
                        errcode = "-2";
                        errmsg = "未返回业务数据";
                        resultdata = "";
                    }
                }
                else
                {
                    errcode = result.apiResultCode;
                    errmsg = result.apiErrorMsg;
                    resultdata = result.apiResultData;
                }
            }
            else
            {
                errcode = "-1";
                errmsg = "接口未返回内容";
                resultdata = "";
            }

            return new JsonResult
            {
                errcode = errcode,
                errmsg = errmsg,
                data = resultdata
            };
        }

        /// <summary>
        /// 异步打印面单结果查询
        /// 使用异步打印返回的打印请求id查询打印结果url。
        /// 建议打印请求发出后延时一定时间（例如2分钟）再调用本接口，并且查询频率不超过每分钟一次。
        /// 注意：目前创建物流订单接口返回信息中已包含面单的下载链接，通常无需专门对接此接口获取面单
        /// </summary>
        /// <param name="partnerID"></param>
        /// <param name="checkword"></param>
        /// <param name="data">业务数据报文 json字符串</param>
        /// <param name="environment">调用环境，bspgw：生产环境；sfapi-hk：香港生产环境；sfapi-sbox：沙箱环境</param>
        /// <returns></returns>
        public static JsonResult IuopAsynPrintResult(string partnerID, string checkword, MsgDataRequestIuopAsynPrintResult data, string accessToken = "", string environment = "bspgw")
        {
            /*
            2.3. 请求参数<msgData>
            2.3.1 元素<请求>
            序号	属性名	类型(约束)	必填	默认值	描述
            1	customerCode	String(50)	Y		客户编码
            2	requestId	String(64)	Y		请求id（可使用UUID，确保请求唯一性字段，只要确保每个请求的requestId唯一即可）
            3	version	String(10)	N		版本号（默认为空即可）
            4	printRequestId	String	Y		打印请求id
            2.4. 公共响应参数
            #	属性名	类型(约束)	必填	默认值	描述
            1	success	String	是		true 请求成功，false 请求失败
            2	errorCode	String	是		错误编码，0成功
            3	errorMsg	String	是		错误描述
            4	msgData	Object	是		返回的详细数据
            2.5. 响应参数<msgData>
            2.5.1 元素<响应>
            #	属性名	类型(约束)	必填	描述
            1	url	String		打印的URL
            2.6. 请求示例\应用场景(JSON)示例
            请求报文:（msgData字段）:

            {
                "customerCode": "ICRME000SRN93",
                "printRequestId":"bcb43e8de88c4a93bc8a28e4e195da8f"
            }
            2.7. 返回示例\应用场景(JSON)示例
            响应报文:

            成功响应:
            {
                "success": true,
                "errorCode": "0",
                "errorMsg": null,
                "msgData": {
                    "url": "http://ibu-ioms-tool.sit.sf-express.com/file/print/async/pdf/20220729/123.pdf"
                }
            }
            失败响应：
            {
                "success": false,
                "errorCode": "123052",
                "errorMsg": "",
                "msgData": null
            }
            */
            string errcode = "";
            string errmsg = "";
            string resultdata = "";

            string serviceCode = "COM_RECE_IUOP_ASYN_PRINT_RESULT";
            string msgData = SFCommon.JsonCompress(JsonHelper.SerializeObject(data));
            string timestamp = SFCommon.GetTimeStamp(); //获取时间戳
            string requestID = Guid.NewGuid().ToString(); //获取uuid

            Dictionary<string, string> content = new Dictionary<string, string>();
            content["partnerID"] = partnerID;
            content["requestID"] = requestID;
            content["serviceCode"] = serviceCode;
            content["timestamp"] = timestamp;
            if (!string.IsNullOrWhiteSpace(accessToken))
            {
                content["accessToken"] = accessToken;
            }
            else
            {
                string msgDigest = SFCommon.MD5ToBase64String(SFCommon.UrlEncode(msgData + timestamp + checkword));
                content["msgDigest"] = msgDigest;
            }
            content["msgData"] = msgData;

            var result = HttpHelper.GetResponseApiResultData(content, null, environment);
            if (result != null)
            {
                if (result.apiResultCode == "A1000")
                {
                    var msgDataResponse = JsonHelper.DeserializeObject<ResponseIuopAsynPrintResult>(result.apiResultData);
                    if (msgDataResponse != null)
                    {
                        errmsg = msgDataResponse.errorMsg;
                        resultdata = JsonHelper.SerializeObject(msgDataResponse.msgData);
                        if (msgDataResponse.success)
                        {
                            errcode = "0";
                        }
                        else
                        {
                            errcode = msgDataResponse.errorCode;
                        }
                    }
                    else
                    {
                        errcode = "-2";
                        errmsg = "未返回业务数据";
                        resultdata = "";
                    }
                }
                else
                {
                    errcode = result.apiResultCode;
                    errmsg = result.apiErrorMsg;
                    resultdata = result.apiResultData;
                }
            }
            else
            {
                errcode = "-1";
                errmsg = "接口未返回内容";
                resultdata = "";
            }

            return new JsonResult
            {
                errcode = errcode,
                errmsg = errmsg,
                data = resultdata
            };
        }

        /// <summary>
        /// 预估总费用
        /// 预估运费以及其他附加费用。
        /// 此接口功能需额外申请开通，请联系顺丰销售协助开通
        /// </summary>
        /// <param name="partnerID"></param>
        /// <param name="checkword"></param>
        /// <param name="data">业务数据报文 json字符串</param>
        /// <param name="environment">调用环境，bspgw：生产环境；sfapi-hk：香港生产环境；sfapi-sbox：沙箱环境</param>
        /// <returns></returns>
        public static JsonResult IuopEstimateFee(string partnerID, string checkword, MsgDataRequestIuopEstimateFee data, string accessToken = "", string environment = "bspgw")
        {
            /*
            2.3. 请求参数<msgData>
            2.3.1 元素<请求>
            序号	属性名	类型(约束)	必填	默认值	描述
            1	customerCode	String(50)	Y		客户编码
            2	version	String(10)	N		版本号（默认为空即可）
            3	interProductCode	String(32)	Y		国际产品映射码
            4	parcelQuantity	Int(8)	N		包裹总件数(大于1表示是子母件，最大值300)
            5	parcelTotalWeight	BigDecimal(16,2)	N		包裹总重量。精确到小数点后2位
            重量单位
            -LBS (US & CA);-KG(else);
            6	parcelTotalLength	BigDecimal(16,2)	N		客户订单货物总长。精确到小数点后2位，尺寸长度单位
            原寄国为CA和US，长度单位为INCH；其他为CM
            7	parcelTotalWidth	BigDecimal(16,2)	N		客户订单货物总宽。精确到小数点后2位
            8	parcelTotalHeight	BigDecimal(16,2)	N		客户订单货物总高。精确到小数点后2位
            9	declaredValue	BigDecimal (16,2)	N		总商品申报价值，单件商品申报价值*数量获取
            10	declaredCurrency	String(10)	N		申报价值币种
            11	paymentInfo	PaymentInfo	N		付款方式信息
            12	senderInfo	SenderInfo	Y		寄件人信息
            13	receiverInfo	ReceiverInfo	Y		收件人信息
            14	customsInfo	CustomsInfo	N		报关信息
            15	addServiceInfoList	List<AddServiceInfo>	N		增值服务信息
            2.3.1.2 元素<请求> PaymentInfo
            序号	属性名	类型(约束)	必填	默认值	描述
            1	payMethod	String(8)	Y		运费付款方式：
            1-寄方付
            2-收方付
            3-第三方付
            2	payMonthCard	String(20)	N		月结卡号（月结支付时填写，现金支付时留空）
            3	taxPayMethod	String(8)	Y		税金付款方式：
            1-寄方付
            2-收方付
            3-第三方付
            （税金无特殊情况通常为收方现金支付，如需寄方支付或第三方支付，税金月结卡号必填且需签署额外的税金结算协议，详情可咨询顺丰客户经理。非跨境订单或无税金产生时选择收方现金支付即可）
            4	taxPayMonthCard	String(20)	N		税金月结卡号
            （税金付款方式选择寄付或第三方支付时，税金月结卡号必填，收方现金支付时留空）
            2.3.1.3 元素<请求> SenderInfo
            序号	属性名	类型(约束)	必填	默认值	描述
            1	country	String(5)	Y		寄件方国家/地区，如：CN,US,JP,KR,SG,MY 更多参考附录字典
            2	postCode	String(20)	Y		邮编
            3	regionFirst	String(128)	N		寄件方地址一级区划（州/省）
            4	regionSecond	String(128)	N		寄件方地址二级区划（城市）
            5	regionThird	String(128)	N		寄件方地址三级区划（区/县）
            6	address	String(200)	N		寄件方详细地址
            7	cargoType	INT(1)	N		寄件方货物类型：1-个人件；2-公司件
            2.3.1.4 元素<请求> ReceiverInfo
            序号	属性名	类型(约束)	必填	默认值	描述
            1	country	String(5)	Y		收件方国家/地区，如：CN,US,JP,KR,SG,MY 更多参考附录字典
            2	postCode	String(20)	Y		邮编
            3	regionFirst	String(128)	N		收件方地址一级区划（州/省）
            4	regionSecond	String(128)	N		收件方地址二级区划（城市）
            5	regionThird	String(128)	N		收件方地址三级区划（区/县）
            6	address	String(200)	N		收件方详细地址
            7	cargoType	INT(1)	N		收件方货物类型：1-个人件；2-公司件
            2.3.1.5 元素<请求> CustomsInfo
            序号	属性名	类型(约束)	必填	默认值	描述
            1	importCustomsType	String(30)	N		进口报关方式 参考附录字典
            2	exportCustomsType	String(30)	N		出口报关方式 参考附录字典
            2.3.1.7 元素<请求> AddServiceInfo
            序号	属性名	类型(约束)	必填	默认值	描述
            1	serviceCode	String(32)	N		增值服务编码
            2	value	String(256)	N		增值服务扩展属性
            3	valueOne	String(256)	N		增值服务扩展属性1
            2.4. 公共响应参数
            #	属性名	类型(约束)	必填	默认值	描述
            1	success	String	是		true 请求成功，false 请求失败
            2	errorCode	String	是		错误编码，0成功
            3	errorMsg	String	是		错误描述
            4	msgData	Object	是		返回的详细数据
            2.5. 响应参数<msgData>
            2.5.1 元素<响应>
            #	属性名	类型(约束)	必填	描述
            1	currency	String		币种
            2	totalFee	BigDecimal		总费用
            3	weight	BigDecimal		重量
            4	interProductCode	String		国际产品映射代码
            5	feeInfoList	List<Dto>		费用信息列表
            2.5.1.1 元素Dto
            #	属性名	类型(约束)	必填	描述
            1	serviceName	String		费用类型：
            运费
            高峰资源调节费
            国际偏远附加服务费
            保价
            代收货款
            进口报关增值服务费
            出口报关增值服务费
            等相关费用
            仅返回已有费用类型，如无则不返回
            2	estimateFee	BigDecimal		预估费用金额
            3	estimatePayFee	BigDecimal		折后费用金额
            2.6. 请求示例\应用场景(JSON)示例
            请求报文:（msgData字段）:

            {
                "customerCode": "ICRME000SRN93",
                "version": "",
                "interProductCode": "INT0014",
                "parcelQuantity": 1,
                "parcelTotalWeight": 5,
                "parcelTotalLength": 10,
                "parcelTotalWidth": 20,
                "parcelTotalHeight": 30,
                "declaredValue": 1000,
                "declaredCurrency": "USD",
                "paymentInfo": {
                    "payMethod": "1",
                    "payMonthCard": "7551234567",
                    "taxPayMethod": "1",
                    "taxPayMonthCard": "7551234567"
                },
                "senderInfo": {
                    "country": "US",
                    "postCode": "10000",
                    "regionFirst": "NewYork",
                    "regionSecond": "Abbeville",
                    "regionThird": "",
                    "address": "306SBRYNMAWRAVE",
                    "cargoType": 1
                },
                "receiverInfo": {
                    "country": "CN",
                    "postCode": "518000",
                    "regionFirst": "Guangdong",
                    "regionSecond": "Shenzhen",
                    "regionThird": "Luohu",
                    "address": "软件产业基地1栋B栋",
                    "cargoType": 1
                },
                "customsInfo": {
                    "importCustomsType": "1",
                    "exportCustomsType": ""
                },
                "addServiceInfoList": [
                    {
                        "serviceCode": "SPP",
                        "value": "1000",
                        "valueOne": ""
                    },
                    {
                        "serviceCode": "COD",
                        "value": "100",
                        "valueOne": "0010002117"
                    }
                ]
            }
            2.7. 返回示例\应用场景(JSON)示例
            响应报文:

            成功响应:
            {
                "success": true,
                "errorCode": "0",
                "errorMsg": null,
                "msgData": {
                    "interProductCode": "INT0014",
                    "totalFee": 36.56,
                    "feeInfoList": [
                        {
                            "estimateFee": 12,
                            "estimatePayFee": 12,
                            "serviceName": "运费"
                        },
                        {
                            "estimateFee": 13,
                            "estimatePayFee": 13,
                            "serviceName": "保价"
                        },
                        {
                            "estimateFee": 1.56,
                            "estimatePayFee": 1.56,
                            "serviceName": "燃油附加费"
                        },
                        {
                            "estimateFee": 2,
                            "estimatePayFee": 2,
                            "serviceName": "进口报关增值服务"
                        },
                        {
                            "estimateFee": 8,
                            "estimatePayFee": 8,
                            "serviceName": "资源调节费"
                        }
                    ],
                    "weight": 5,
                    "currency": "USD"
                }
            }
            失败响应：
            {
                "success": false,
                "errorCode": "123052",
                "errorMsg": ".",
                "msgData": null
            }
            */
            string errcode = "";
            string errmsg = "";
            string resultdata = "";

            string serviceCode = "COM_RECE_IUOP_ESTIMATE_FEE";
            string msgData = SFCommon.JsonCompress(JsonHelper.SerializeObject(data));
            string timestamp = SFCommon.GetTimeStamp(); //获取时间戳
            string requestID = Guid.NewGuid().ToString(); //获取uuid

            Dictionary<string, string> content = new Dictionary<string, string>();
            content["partnerID"] = partnerID;
            content["requestID"] = requestID;
            content["serviceCode"] = serviceCode;
            content["timestamp"] = timestamp;
            if (!string.IsNullOrWhiteSpace(accessToken))
            {
                content["accessToken"] = accessToken;
            }
            else
            {
                string msgDigest = SFCommon.MD5ToBase64String(SFCommon.UrlEncode(msgData + timestamp + checkword));
                content["msgDigest"] = msgDigest;
            }
            content["msgData"] = msgData;

            var result = HttpHelper.GetResponseApiResultData(content, null, environment);
            if (result != null)
            {
                if (result.apiResultCode == "A1000")
                {
                    var msgDataResponse = JsonHelper.DeserializeObject<ResponseIuopEstimateFee>(result.apiResultData);
                    if (msgDataResponse != null)
                    {
                        errmsg = msgDataResponse.errorMsg;
                        resultdata = JsonHelper.SerializeObject(msgDataResponse.msgData);
                        if (msgDataResponse.success)
                        {
                            errcode = "0";
                        }
                        else
                        {
                            errcode = msgDataResponse.errorCode;
                        }
                    }
                    else
                    {
                        errcode = "-2";
                        errmsg = "未返回业务数据";
                        resultdata = "";
                    }
                }
                else
                {
                    errcode = result.apiResultCode;
                    errmsg = result.apiErrorMsg;
                    resultdata = result.apiResultData;
                }
            }
            else
            {
                errcode = "-1";
                errmsg = "接口未返回内容";
                resultdata = "";
            }

            return new JsonResult
            {
                errcode = errcode,
                errmsg = errmsg,
                data = resultdata
            };
        }

        /// <summary>
        /// BBD预合单
        /// 目前仅企业月结客户可以预合自己的BBD单
        /// </summary>
        /// <param name="partnerID"></param>
        /// <param name="checkword"></param>
        /// <param name="data">业务数据报文 json字符串</param>
        /// <param name="environment">调用环境，bspgw：生产环境；sfapi-hk：香港生产环境；sfapi-sbox：沙箱环境</param>
        /// <returns></returns>
        public static JsonResult IuopBbdPreMerge(string partnerID, string checkword, MsgDataRequestIuopBbdPreMerge data, string accessToken = "", string environment = "bspgw")
        {
            /*
            2.3. 请求参数<msgData>
            2.3.1 元素<请求>
            序号	属性名	类型(约束)	必填	默认值	描述
            1	customerCode	String(50)	Y		客户编码
            2	version	String(10)	N		版本号（默认为空即可）
            3	sfWayBillNos	List<String>	Y		待合运单号
            2.4. 公共响应参数
            #	属性名	类型(约束)	必填	默认值	描述
            1	success	String	是		true 请求成功，false 请求失败
            2	errorCode	String	是		错误编码，0成功
            3	errorMsg	String	是		错误描述
            4	msgData	Object	是		返回的详细数据
            2.5. 响应参数<msgData>
            2.5.1 元素<响应>
            #	属性名	类型(约束)	必填	描述
            1	preMergeSfWaybillNo	String		预合单号
            2	printUrl	String		运单打印地址
            2.6. 请求示例\应用场景(JSON)示例
            请求报文:（msgData字段）:

            {
	            "version": "1",
	            "customerCode": "ICRME000SRN93",
	            "sfWayBillNos": [
		            "SF1342822426747",
		            "SF1334452633802"
	            ]
            }
            2.7. 返回示例\应用场景(JSON)示例
            响应报文:

            成功响应:
            {
                "success": true,
                "errorCode": "0",
                "errorMsg": null,
                "msgData": {
                    "preMergeSfWaybillNo": "SFXXXXXXXXXXXX"
                }
            }
            失败响应：
            {
                "success": false,
                "errorCode": "123052",
                "errorMsg": "",
                "msgData": null
            }
            */
            string errcode = "";
            string errmsg = "";
            string resultdata = "";

            string serviceCode = "COM_RECE_IUOP_BBD_PRE_MERGE";
            string msgData = SFCommon.JsonCompress(JsonHelper.SerializeObject(data));
            string timestamp = SFCommon.GetTimeStamp(); //获取时间戳
            string requestID = Guid.NewGuid().ToString(); //获取uuid

            Dictionary<string, string> content = new Dictionary<string, string>();
            content["partnerID"] = partnerID;
            content["requestID"] = requestID;
            content["serviceCode"] = serviceCode;
            content["timestamp"] = timestamp;
            if (!string.IsNullOrWhiteSpace(accessToken))
            {
                content["accessToken"] = accessToken;
            }
            else
            {
                string msgDigest = SFCommon.MD5ToBase64String(SFCommon.UrlEncode(msgData + timestamp + checkword));
                content["msgDigest"] = msgDigest;
            }
            content["msgData"] = msgData;

            var result = HttpHelper.GetResponseApiResultData(content, null, environment);
            if (result != null)
            {
                if (result.apiResultCode == "A1000")
                {
                    var msgDataResponse = JsonHelper.DeserializeObject<ResponseIuopBbdPreMerge>(result.apiResultData);
                    if (msgDataResponse != null)
                    {
                        errmsg = msgDataResponse.errorMsg;
                        resultdata = JsonHelper.SerializeObject(msgDataResponse.msgData);
                        if (msgDataResponse.success)
                        {
                            errcode = "0";
                        }
                        else
                        {
                            errcode = msgDataResponse.errorCode;
                        }
                    }
                    else
                    {
                        errcode = "-2";
                        errmsg = "未返回业务数据";
                        resultdata = "";
                    }
                }
                else
                {
                    errcode = result.apiResultCode;
                    errmsg = result.apiErrorMsg;
                    resultdata = result.apiResultData;
                }
            }
            else
            {
                errcode = "-1";
                errmsg = "接口未返回内容";
                resultdata = "";
            }

            return new JsonResult
            {
                errcode = errcode,
                errmsg = errmsg,
                data = resultdata
            };
        }

        /// <summary>
        /// BBD合单结果查询
        /// BBD真实合单结果查询接口
        /// </summary>
        /// <param name="partnerID"></param>
        /// <param name="checkword"></param>
        /// <param name="data">业务数据报文 json字符串</param>
        /// <param name="environment">调用环境，bspgw：生产环境；sfapi-hk：香港生产环境；sfapi-sbox：沙箱环境</param>
        /// <returns></returns>
        public static JsonResult IuopBbdMergeResult(string partnerID, string checkword, MsgDataRequestIuopBbdMergeResult data, string accessToken = "", string environment = "bspgw")
        {
            /*
            2.3. 请求参数<msgData>
            2.3.1 元素<请求>
            序号	属性名	类型(约束)	必填	默认值	描述
            1	customerCode	String(32)	Y		客户编码
            2	sfWaybillNo	String(32)	Y		顺丰运单号（母单或子单）
            3	mergeSfWaybillNo	String(32)	Y		合单单号（母单或子单）
            2.4. 公共响应参数
            #	属性名	类型(约束)	必填	默认值	描述
            1	success	String	是		true 请求成功，false 请求失败
            2	errorCode	String	是		错误编码，0成功
            3	errorMsg	String	是		错误描述
            4	msgData	Object	是		返回的详细数据
            2.5. 响应参数<msgData>
            2.5.1 元素<响应>
            #	属性名	类型(约束)	必填	描述
            1	mergeSfWaybillNos	String		合单单号（可包含多个，格式：母单号,子单号,子单号…）
            2	mergeRelationList	List<DtoInfo>		合单关系
            2.5.1.1 元素Dto
            #	属性名	类型(约束)	必填	描述
            1	mergeSfWaybillNo	String		合单号（大单母单号或子单号）
            2	sfWaybillNos	String		顺丰运单号（可包含多个，格式：运单号,运单号,运单号,…）
            2.6. 请求示例\应用场景(JSON)示例
            请求报文:（msgData字段）:

            {
                "customerCode": "ICRME000SRN93",
                "mergeSfWaybillNo": "SF1040458769540",
                "sfWaybillNo": "SF7000500391343"
            }
            2.7. 返回示例\应用场景(JSON)示例
            响应报文:

            成功响应:
            {
                "success": true,
                "errorCode": "0",
                "errorMsg": null,
                "msgData": [
                    {
                        "mergeRelationList": [
                            {
                                "mergeSfWaybillNo": "SFXXXXXXXXXXXX",
                                "sfWaybillNos": "SFXXXXXXXXXXXX,SFXXXXXXXXXXXX"
                            },
                            {
                                "mergeSfWaybillNo": "SFXXXXXXXXXXXX",
                                "sfWaybillNos": "SFXXXXXXXXXXXX,SFXXXXXXXXXXXX"
                            }
                        ],
                        "mergeSfWaybillNos": "SFXXXXXXXXXXXX,SFXXXXXXXXXXXX"
                    }
                ]
            }
            失败响应：
            {
                "success": false,
                "errorCode": "123052",
                "errorMsg": "",
                "msgData": null
            }
            */
            string errcode = "";
            string errmsg = "";
            string resultdata = "";

            string serviceCode = "COM_RECE_IUOP_BBD_MERGE_RESULT";
            string msgData = SFCommon.JsonCompress(JsonHelper.SerializeObject(data));
            string timestamp = SFCommon.GetTimeStamp(); //获取时间戳
            string requestID = Guid.NewGuid().ToString(); //获取uuid

            Dictionary<string, string> content = new Dictionary<string, string>();
            content["partnerID"] = partnerID;
            content["requestID"] = requestID;
            content["serviceCode"] = serviceCode;
            content["timestamp"] = timestamp;
            if (!string.IsNullOrWhiteSpace(accessToken))
            {
                content["accessToken"] = accessToken;
            }
            else
            {
                string msgDigest = SFCommon.MD5ToBase64String(SFCommon.UrlEncode(msgData + timestamp + checkword));
                content["msgDigest"] = msgDigest;
            }
            content["msgData"] = msgData;

            var result = HttpHelper.GetResponseApiResultData(content, null, environment);
            if (result != null)
            {
                if (result.apiResultCode == "A1000")
                {
                    var msgDataResponse = JsonHelper.DeserializeObject<ResponseIuopBbdMergeResult>(result.apiResultData);
                    if (msgDataResponse != null)
                    {
                        errmsg = msgDataResponse.errorMsg;
                        resultdata = JsonHelper.SerializeObject(msgDataResponse.msgData);
                        if (msgDataResponse.success)
                        {
                            errcode = "0";
                        }
                        else
                        {
                            errcode = msgDataResponse.errorCode;
                        }
                    }
                    else
                    {
                        errcode = "-2";
                        errmsg = "未返回业务数据";
                        resultdata = "";
                    }
                }
                else
                {
                    errcode = result.apiResultCode;
                    errmsg = result.apiErrorMsg;
                    resultdata = result.apiResultData;
                }
            }
            else
            {
                errcode = "-1";
                errmsg = "接口未返回内容";
                resultdata = "";
            }

            return new JsonResult
            {
                errcode = errcode,
                errmsg = errmsg,
                data = resultdata
            };
        }

        /// <summary>
        /// 取消BBD预合单
        /// </summary>
        /// <param name="partnerID"></param>
        /// <param name="checkword"></param>
        /// <param name="data">业务数据报文 json字符串</param>
        /// <param name="environment">调用环境，bspgw：生产环境；sfapi-hk：香港生产环境；sfapi-sbox：沙箱环境</param>
        /// <returns></returns>
        public static JsonResult IuopCancelBbdMerge(string partnerID, string checkword, MsgDataRequestIuopCancelBbdMerge data, string accessToken = "", string environment = "bspgw")
        {
            /*
            2.3. 请求参数<msgData>
            2.3.1 元素<请求>
            序号	属性名	类型(约束)	必填	默认值	描述
            1	customerCode	String	Y		客户编码
            2	sfWayBillNos	List<String>	Y		预合单号列表
            2.4. 公共响应参数
            #	属性名	类型(约束)	必填	默认值	描述
            1	success	String	是		true 请求成功，false 请求失败
            2	errorCode	String	是		错误编码，0成功
            3	errorMsg	String	是		错误描述
            4	msgData	Boolean	是		返回的详细数据
            2.6. 请求示例\应用场景(JSON)示例
            请求报文:（msgData字段）:

            {
                "customerCode": "ICRME000SRN93",
                "sfWayBillNos": [
                    "SF1342822426747",
                    "SF1334452633802"
                ]
            }
            2.7. 返回示例\应用场景(JSON)示例
            响应报文:

            成功响应:
            {
                "success": true,
                "errorCode": "0",
                "errorMsg": null,
                "msgData": true
            }
            失败响应：
            {
                "success": false,
                "errorCode": "123052",
                "errorMsg": "",
                "msgData": null
            }
            */
            string errcode = "";
            string errmsg = "";
            string resultdata = "";

            string serviceCode = "COM_RECE_IUOP_CANCEL_BBD_MERGE";
            string msgData = SFCommon.JsonCompress(JsonHelper.SerializeObject(data));
            string timestamp = SFCommon.GetTimeStamp(); //获取时间戳
            string requestID = Guid.NewGuid().ToString(); //获取uuid

            Dictionary<string, string> content = new Dictionary<string, string>();
            content["partnerID"] = partnerID;
            content["requestID"] = requestID;
            content["serviceCode"] = serviceCode;
            content["timestamp"] = timestamp;
            if (!string.IsNullOrWhiteSpace(accessToken))
            {
                content["accessToken"] = accessToken;
            }
            else
            {
                string msgDigest = SFCommon.MD5ToBase64String(SFCommon.UrlEncode(msgData + timestamp + checkword));
                content["msgDigest"] = msgDigest;
            }
            content["msgData"] = msgData;

            var result = HttpHelper.GetResponseApiResultData(content, null, environment);
            if (result != null)
            {
                if (result.apiResultCode == "A1000")
                {
                    var msgDataResponse = JsonHelper.DeserializeObject<ResponseIuopCancelBbdMerge>(result.apiResultData);
                    if (msgDataResponse != null)
                    {
                        errmsg = msgDataResponse.errorMsg;
                        resultdata = JsonHelper.SerializeObject(msgDataResponse.msgData);
                        if (msgDataResponse.success)
                        {
                            errcode = "0";
                        }
                        else
                        {
                            errcode = msgDataResponse.errorCode;
                        }
                    }
                    else
                    {
                        errcode = "-2";
                        errmsg = "未返回业务数据";
                        resultdata = "";
                    }
                }
                else
                {
                    errcode = result.apiResultCode;
                    errmsg = result.apiErrorMsg;
                    resultdata = result.apiResultData;
                }
            }
            else
            {
                errcode = "-1";
                errmsg = "接口未返回内容";
                resultdata = "";
            }

            return new JsonResult
            {
                errcode = errcode,
                errmsg = errmsg,
                data = resultdata
            };
        }

        #endregion 国际快递业务场景接入
    }
}
